# app.py (tu archivo de backend Python)
from flask import Flask, request, jsonify
from flask_cors import CORS
import google.generativeai as genai
import os
import requests # Para hacer llamadas HTTP a la API de Stopcar
import json     # Para manejar JSON
import re
import uuid # Para generar IDs de sesión únicos

app = Flask(__name__)
CORS(app) # Habilita CORS para todas las rutas. En producción, especifica origins.

# --- Configuración de Gemini ---
#gemini_api_key = os.getenv("GEMINI_API_KEY")

gemini_api_key = "AIzaSyAx50JSlCAg5nUTKvXZh52WuvUdJmdkvdc" # ¡CAMBIA ESTO!
genai.configure(api_key=gemini_api_key)

if not gemini_api_key:
    raise ValueError("GEMINI_API_KEY no encontrada. Por favor, configura la variable de entorno.")

genai.configure(api_key=gemini_api_key)

# El nombre del modelo de Gemini que confirmaste que funciona
GEMINI_MODEL_NAME = 'gemini-2.5-flash-lite-preview-06-17' # O 'gemini-1.0-pro' o el que te haya listado el comando
gemini_model = genai.GenerativeModel(GEMINI_MODEL_NAME)

# --- Configuración de Stopcar API ---
STOPCAR_API_URL = "https://gps.divisiongps.com.ar/index.php?r=api/integrador"
# ¡Importante! Reemplaza con tu token real de Stopcar. También considera usar una variable de entorno.
STOPCAR_TOKEN = "cab8fa81616e5c3a2f17b25699149732"

# Regex para extraer la patente: PATENTE="AAA111"
import re
PATENT_REGEX = re.compile(r'PATENTE\s*=\s*"(.*?)"')

def get_vehicle_info_stopcar(token: str, dominio: str):
    """
    Realiza una solicitud HTTP POST a la API de Stopcar para obtener
    información de un vehículo específico.
    """
    payload = {
        "token": token,
        "dominio": dominio
    }
    headers = {
        "Content-Type": "application/json"
    }

    print(f"Intentando conectar a la API de Stopcar en: {STOPCAR_API_URL}")
    print(f"Enviando payload a Stopcar: {json.dumps(payload)}")

    try:
        response = requests.post(STOPCAR_API_URL, headers=headers, data=json.dumps(payload), timeout=10) # Añadir timeout
        response.raise_for_status() # Lanza una excepción para códigos de estado HTTP erróneos (4xx o 5xx)
        data = response.json()
        return data
    except requests.exceptions.RequestException as e:
        print(f"Error al conectar con Stopcar: {e}")
        # Intentar obtener el texto de la respuesta si hay un HTTPError
        if hasattr(e, 'response') and e.response is not None:
            print(f"Respuesta de Stopcar: {e.response.text}")
        return {"error": f"No se pudo obtener información del vehículo desde Stopcar: {str(e)}"}
    except json.JSONDecodeError as e:
        print(f"Error al decodificar JSON de la respuesta de Stopcar: {e}")
        print(f"Contenido de la respuesta de Stopcar que causó el error: {response.text}")
        return {"error": f"Error al procesar la respuesta de Stopcar: {str(e)}"}


@app.route('/chat', methods=['POST'])
def chat_endpoint():
    try:
        data = request.json
        user_message = data.get('message')
        session_id = data.get('session_id') # Obtener el ID de sesión del frontend

        if not user_message:
            return jsonify({"error": "No message provided"}), 400
        if not session_id:
            return jsonify({"error": "Session ID not provided"}), 400
# Obtener o crear la sesión de chat para este usuario
        if session_id not in chat_sessions:
            print(f"Creando nueva sesión de chat para ID: {session_id}")
            chat_sessions[session_id] = gemini_model.start_chat(history=[])
        
        chat_session = chat_sessions[session_id]
        
        enriched_prompt_parts = []
        stopcar_data = None
        extracted_patent = None

        # 1. Intentar extraer la patente del mensaje del usuario
        match = PATENT_REGEX.search(user_message)
        if match:
            extracted_patent = match.group(1).strip().upper() # Extrae y normaliza
            print(f"Patente detectada en el mensaje: {extracted_patent}")
            
            # Quitar la parte de la patente del mensaje original para Gemini
            # Esto evita que Gemini vea "PATENTE=..." en el prompt principal
            user_message_clean = PATENT_REGEX.sub('', user_message).strip()
            enriched_prompt_parts.append(f"El usuario pregunta: '{user_message_clean}'.")

            # 2. Llamar a la API de Stopcar
            stopcar_data = get_vehicle_info_stopcar(STOPCAR_TOKEN, extracted_patent)
            
            if stopcar_data and stopcar_data.get('status') == 200:
                print("Datos de Stopcar obtenidos exitosamente.")
                # Añadir los datos de Stopcar al prompt para Gemini
                enriched_prompt_parts.append(f"Esta es la información del vehículo con patente {extracted_patent} de Stopcar: {json.dumps(stopcar_data['data'], indent=2)}.")
                
                # Puedes construir un prompt más estructurado si quieres que Gemini se enfoque
                # en ciertos campos. Por ejemplo:
                # vehicle_data = stopcar_data['data']
                # lat = vehicle_data.get('latitud')
                # lon = vehicle_data.get('longitud')
                # speed = vehicle_data.get('velocidad')
                # event_date = vehicle_data.get('fecha_evento')
                #
                # enriched_prompt_parts.append(f"Analiza los siguientes datos del vehículo (patente: {extracted_patent}): Latitud: {lat}, Longitud: {lon}, Velocidad: {speed}, Fecha del evento: {event_date}. ")
                # enriched_prompt_parts.append("Basado en esto, dame un resumen de la última posición, geocodifica la latitud y longitud con Google Maps, da la ubicación en calle y número, y un link al mapa de Google de la misma. Verifica si, de acuerdo a la velocidad, el vehículo estaba encendido. Interpreta los datos según clave-valor y no muestres más información que la pedida, en castellano.")
                
            else:
                error_message_stopcar = stopcar_data.get('error', 'Error desconocido al obtener datos de Stopcar.')
                print(f"Error al obtener datos de Stopcar: {error_message_stopcar}")
                enriched_prompt_parts.append(f"Hubo un problema al obtener datos del vehículo con patente {extracted_patent} de Stopcar: {error_message_stopcar}. ")
                enriched_prompt_parts.append(f"Por favor, responde al usuario basándote solo en su pregunta original: '{user_message_clean}'.")
        else:
            # Si no se encontró una patente, solo usa el mensaje original del usuario
            enriched_prompt_parts.append(f"El usuario pregunta: '{user_message}'.")


        # Construye el prompt final para Gemini
        # Aquí puedes añadir las instrucciones que le diste a Ollama antes
        gemini_instruction = "Como si fueras un operador de atención al cliente de una empresa que se dedica al rastreo vehicular, en forma reducida, analizando la información proporcionada (si hay), dame un resumen de la última posición, geocodiza la latitud y longitud con Google Maps, da la ubicación en calle y número, y un link al mapa de Google de la misma. Verifica además si de acuerdo a la velocidad el vehículo estaba encendido. Interpreta los datos según clave-valor. No muestres más información que la pedida. Responde en castellano."
        
        final_gemini_prompt = gemini_instruction + "\n\n" + "\n".join(enriched_prompt_parts)
        
        print(f"Prompt final enviado a Gemini:\n{final_gemini_prompt}")

        # 3. Envía el prompt enriquecido a Gemini
        response_gemini = gemini_model.generate_content(final_gemini_prompt)
        gemini_content = response_gemini.text

        return jsonify({"reply": gemini_content})

    except Exception as e:
        print(f"Error en el backend: {e}")
        if "API key not valid" in str(e):
             return jsonify({"error": "Error de autenticación con Gemini. Revisa tu API Key."}), 500
        return jsonify({"error": str(e)}), 500

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5002, debug=True)