import requests
import json

# URL de la API de Stopcar para el método integrador
API_URL = "https://gps.divisiongps.com.ar/index.php?r=api/integrador"

# Token de acceso proporcionado por el usuario
TOKEN = "cab8fa81616e5c3a2f17b25699149732"

# Dominio (patente del vehículo) para el cual se desea obtener información
DOMINIO = "AA494XW"

# URL de la instancia de Ollama
OLLAMA_URL = "http://192.168.142.245:11434/api/generate" # Asumiendo el endpoint 


def get_vehicle_info(token: str, dominio: str):
    """
    Realiza una solicitud HTTP POST a la API de Stopcar para obtener
    información de un vehículo específico.

    Args:
        token (str): El token de acceso único del cliente.
        dominio (str): La patente del vehículo (dominio).

    Returns:
        dict: Un diccionario con la respuesta JSON de la API, o None si hay un error.
    """
    # Los parámetros se envían en el cuerpo de la solicitud como JSON,
    # según la documentación de la API de Stopcar.
    payload = {
        "token": token,
        "dominio": dominio
    }

    # Encabezados para indicar que el cuerpo de la solicitud es JSON
    headers = {
        "Content-Type": "application/json"
    }

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

    try:
        response = requests.post(API_URL, headers=headers, data=json.dumps(payload))

        # Verificar si la solicitud fue exitosa (código de estado 200)
        response.raise_for_status() # Lanza una excepción para códigos de estado HTTP erróneos (4xx o 5xx)

        # Parsear la respuesta JSON
        data = response.json()
        return data

    except requests.exceptions.HTTPError as http_err:
        print(f"Error HTTP al conectar con Stopcar: {http_err}")
        print(f"Respuesta del servidor Stopcar (si disponible): {response.text}")
    except requests.exceptions.ConnectionError as conn_err:
        print(f"Error de conexión al conectar con Stopcar: {conn_err}")
    except requests.exceptions.Timeout as timeout_err:
        print(f"Tiempo de espera agotado al conectar con Stopcar: {timeout_err}")
    except requests.exceptions.RequestException as req_err:
        print(f"Error inesperado de la solicitud al conectar con Stopcar: {req_err}")
    except json.JSONDecodeError as json_err:
        print(f"Error al decodificar JSON de la respuesta de Stopcar: {json_err}")
        print(f"Contenido de la respuesta de Stopcar que causó el error: {response.text}")
    return None

def query_ollama(data_from_stopcar: dict):
    """
    Envía la información obtenida de la API de Stopcar a Ollama para su procesamiento.

    Args:
        data_from_stopcar (dict): El diccionario JSON con los datos del vehículo.

    Returns:
        dict: La respuesta JSON de Ollama, o None si hay un error.
    """
    if not data_from_stopcar:
        print("No hay datos de Stopcar para enviar a Ollama.")
        return None

    # Construir el prompt para Ollama. Puedes personalizar esto según lo que quieras preguntar.
    # Se convierte el diccionario de datos a una cadena JSON para incluirlo en el prompt.
    prompt_text = f"Como si fueras un operador de atencion al cliente de una empresa que se dedica al rastreo vehicular, en forma reducida, Analiza la siguiente información de un vehículo y dime un resumen de su última posición, geocodizar la latitud y longitud con google maps, dar la locacion en calle y numero, y un link al mapa de google de la amisa, verificar ademas si de acuerdo a la velcidad el vehiculoe estaba encendido, interpretando los datos segun clave valor, no mostrar mas informacion que al pedida:, en castellano\n\n{json.dumps(data_from_stopcar, indent=2)}"

    # Payload para la API de Ollama
    # Asegúrate de que el modelo 'llama2' esté disponible en tu instancia de Ollama.
    # Puedes cambiar 'llama2' por el nombre del modelo que estés usando.
    ollama_payload = {
       # "model": "llama3:latest", # Cambia esto si usas otro modelo en Ollama
         "model": "deepseek-r1:1.5b",
         "prompt": prompt_text,
        "stream": False # Para obtener la respuesta completa de una vez
    }

    ollama_headers = {
        "Content-Type": "application/json"
    }

    print(f"\nIntentando conectar a Ollama en: {OLLAMA_URL}")
    print(f"Enviando payload a Ollama (primeras 100 chars del prompt): {json.dumps(ollama_payload, indent=2)[:100]}...")

    try:
        ollama_response = requests.post(OLLAMA_URL, headers=ollama_headers, data=json.dumps(ollama_payload))
        ollama_response.raise_for_status() # Lanza una excepción para códigos de estado HTTP erróneos

        ollama_data = ollama_response.json()
        return ollama_data

    except requests.exceptions.HTTPError as http_err:
        print(f"Error HTTP al conectar con Ollama: {http_err}")
        print(f"Respuesta del servidor Ollama (si disponible): {ollama_response.text}")
    except requests.exceptions.ConnectionError as conn_err:
        print(f"Error de conexión al conectar con Ollama: {conn_err}")
    except requests.exceptions.Timeout as timeout_err:
        print(f"Tiempo de espera agotado al conectar con Ollama: {timeout_err}")
    except requests.exceptions.RequestException as req_err:
        print(f"Error inesperado de la solicitud al conectar con Ollama: {req_err}")
    except json.JSONDecodeError as json_err:
        print(f"Error al decodificar JSON de la respuesta de Ollama: {json_err}")
        print(f"Contenido de la respuesta de Ollama que causó el error: {ollama_response.text}")
    return None


@app.route('/chat', methods=['POST'])

def chat_endpoint():
    try:
        data = request.json
        user_message = data.get('message')

        if not user_message:
            return jsonify({"error": "No message provided"}), 400

        # --- AQUÍ ES DONDE INTEGRARÍAS TU OTRA API DE TERCERO ---
        # Ejemplo:
        # info_from_third_api = get_info_from_third_party_api(user_message)
        #
        # Enriquecer el prompt con la información de la API de tercero
        # enriched_prompt = f"El usuario pregunta: '{user_message}'. Además, esta es información relevante de mi sistema: {info_from_third_api}. Responde al usuario basándote en esta información."
        #
        # Por ahora, usaremos el mensaje original:
        enriched_prompt = user_message

        # Envía el mensaje a Ollama
        response_ollama = ollama_client.chat(
            model=OLLAMA_MODEL,
            messages=[{'role': 'user', 'content': enriched_prompt}],
            stream=False # Para este ejemplo simple, no hacemos streaming al frontend
        )

        ollama_content = response_ollama['message']['content']

        return jsonify({"reply": ollama_content})

    except Exception as e:
        print(f"Error en el backend: {e}")
        return jsonify({"error": str(e)}), 500
    

if __name__ == "__main__":
    # app.run(host='0.0.0.0', port=5000, debug=True)
     
    print("Iniciando la conexión a la API de Stopcar...")
    vehicle_data = get_vehicle_info(TOKEN, DOMINIO)

    if vehicle_data:
        print("\nInformación del vehículo obtenida exitosamente de Stopcar:")
        print(json.dumps(vehicle_data, indent=4))

        # Verificar si la respuesta de Stopcar fue exitosa antes de enviar a Ollama
        if vehicle_data.get("status") == 200 and vehicle_data.get("code") == 1:
            ollama_result = query_ollama(vehicle_data)
            if ollama_result:
                print("\nRespuesta de Ollama:")
                # La respuesta de Ollama puede variar, pero 'response' suele contener el texto generado.
                print(json.dumps(ollama_result, indent=4))
                if "response" in ollama_result:
                    print("\nTexto generado por Ollama:")
                    print(ollama_result["response"])
                else:
                    print("La respuesta de Ollama no contiene la clave 'response'.")
            else:
                print("\nNo se pudo obtener una respuesta de Ollama.")
        else:
            print(f"\nLa API de Stopcar devolvió un estado no exitoso: Status={vehicle_data.get('status')}, Code={vehicle_data.get('code')}")
            print(f"Mensaje: {vehicle_data.get('message')}")
            print(f"Info: {vehicle_data.get('info')}")
    else:
        print("\nNo se pudo obtener la información del vehículo de Stopcar.")