ShrishtiAI-backend / server /controllers /chat_controller.py
MEWTROS
My 6 can be your 9
5ccd893
"""
Chat Controller
Handles chat-related business logic and service coordination
"""
import logging
from typing import Dict, Any, Optional
from flask import request
from services.ai_service import AIService
from services.gee_service import GEEService
class ChatController:
"""Controller for chat operations"""
def __init__(self, ai_service: AIService, gee_service: GEEService):
self.ai_service = ai_service
self.gee_service = gee_service
self.logger = logging.getLogger(__name__)
def handle_chat_message(self, data: Dict[str, Any]) -> Dict[str, Any]:
"""
Process incoming chat message and generate response
Args:
data: Request data containing message and optional context
Returns:
Response dictionary
"""
try:
# Extract message from request data
message = data.get('message', '').strip()
if not message:
return {
'error': 'Message is required',
'status': 'error'
}
# Extract optional context
context = data.get('context', {})
# Check if satellite data is requested
location = context.get('location')
if location and isinstance(location, dict):
lat = location.get('latitude')
lon = location.get('longitude')
if lat is not None and lon is not None:
# Add satellite data to context
context = self._enrich_context_with_satellite_data(context, lat, lon)
# Generate AI response
response = self.ai_service.generate_response(message, context)
if response['status'] == 'success':
return {
'response': response['message'],
'status': 'success',
'metadata': {
'model': response.get('model'),
'attempt': response.get('attempt'),
'context_enriched': bool(context)
}
}
else:
return {
'error': response.get('message', 'Failed to generate response'),
'status': 'error'
}
except Exception as e:
self.logger.error(f"Chat message processing error: {str(e)}")
return {
'error': f'Internal server error: {str(e)}',
'status': 'error'
}
def _enrich_context_with_satellite_data(self, context: Dict[str, Any], lat: float, lon: float) -> Dict[str, Any]:
"""
Enrich context with satellite data if GEE is available
Args:
context: Current context
lat: Latitude
lon: Longitude
Returns:
Enriched context
"""
try:
if self.gee_service.initialized:
# Get recent satellite data (last 30 days)
from datetime import datetime, timedelta
end_date = datetime.now()
start_date = end_date - timedelta(days=30)
satellite_data = self.gee_service.get_satellite_data(
latitude=lat,
longitude=lon,
start_date=start_date.strftime('%Y-%m-%d'),
end_date=end_date.strftime('%Y-%m-%d')
)
context['satellite_data'] = satellite_data
except Exception as e:
self.logger.warning(f"Failed to enrich context with satellite data: {str(e)}")
return context
def analyze_location(self, data: Dict[str, Any]) -> Dict[str, Any]:
"""
Analyze a specific location for disaster indicators
Args:
data: Request data containing location and analysis parameters
Returns:
Analysis results
"""
try:
# Extract location data
latitude = data.get('latitude')
longitude = data.get('longitude')
if latitude is None or longitude is None:
return {
'error': 'Latitude and longitude are required',
'status': 'error'
}
# Get satellite data
from datetime import datetime, timedelta
end_date = datetime.now()
start_date = end_date - timedelta(days=data.get('days_back', 30))
satellite_data = self.gee_service.get_satellite_data(
latitude=latitude,
longitude=longitude,
start_date=start_date.strftime('%Y-%m-%d'),
end_date=end_date.strftime('%Y-%m-%d'),
cloud_filter=data.get('cloud_filter', 20)
)
# Get AI analysis
user_query = data.get('query', 'Analyze this location for potential disaster indicators')
analysis = self.ai_service.analyze_satellite_data(satellite_data, user_query)
return {
'status': 'success',
'location': {
'latitude': latitude,
'longitude': longitude
},
'satellite_data': satellite_data,
'analysis': analysis,
'parameters': {
'days_back': data.get('days_back', 30),
'cloud_filter': data.get('cloud_filter', 20)
}
}
except Exception as e:
self.logger.error(f"Location analysis error: {str(e)}")
return {
'error': f'Analysis failed: {str(e)}',
'status': 'error'
}
def get_disaster_info(self, disaster_type: str, location_data: Dict[str, Any] = None) -> Dict[str, Any]:
"""
Get information about a specific disaster type
Args:
disaster_type: Type of disaster
location_data: Optional location context
Returns:
Disaster information
"""
try:
# Validate disaster type
valid_disasters = ['flood', 'drought', 'storm', 'landslide', 'wildfire', 'earthquake']
if disaster_type.lower() not in valid_disasters:
return {
'error': f'Invalid disaster type. Valid types: {", ".join(valid_disasters)}',
'status': 'error'
}
# Get AI insights
insights = self.ai_service.get_disaster_insights(disaster_type, location_data)
return {
'status': 'success',
'disaster_type': disaster_type,
'insights': insights,
'location_specific': bool(location_data)
}
except Exception as e:
self.logger.error(f"Disaster info error: {str(e)}")
return {
'error': f'Failed to get disaster information: {str(e)}',
'status': 'error'
}