from pydantic import BaseModel
from datetime import datetime
from pymongo import MongoClient
from groq import Groq
from fastapi import HTTPException
import os
from dotenv import load_dotenv
from app.config import config
import pytz
import requests


# Cliente de Groq
#client_groq = Groq(api_key=config.GROQ_API_KEY)
OPENROUTERKEY ="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"

# MongoDB
mongo_client = MongoClient(config.MONGO_URI)
db = mongo_client[config.DB_NAME]
collection = db["historias_clinicas"]

# Zona horaria
colombia_tz = pytz.timezone("America/Bogota")

class HistoriaClinicaRequest(BaseModel):
    descripcion: str

    @staticmethod
    def analizar_historiaclinica(descripcion: str) -> str:
        """Realiza el análisis de la historia clínica """
        try:
            pregunta = {
            #"model": "google/gemini-2.0-flash-exp:free",
            "model": "openrouter/cypher-alpha:free",
            "messages": [
                {
                                "role": "system",
                                "content": "Eres un analista médico experto. Analiza la historia clínica enviada y proporciona un análisis estructurado."
                            },
            {
                "content": f"""
Analiza la historia clínica proporcionada y devuelve un objeto JSON con las siguientes secciones:
- 'resumen': Un breve resumen del caso.
- 'diagnosticos': Un diccionario donde cada clave sea el código CIE-10 y el valor sea la descripción del diagnóstico.
- 'procedimientos': Un diccionario donde cada clave sea el código CPT o CIE-9-CM y el valor sea la descripción del procedimiento.

Formato exacto a retornar (sin texto adicional):
{{"resumen": "xxx", "diagnosticos": {{"codigo1": "texto", "codigo2": "texto2"}}, "procedimientos": {{"codigo1": "texto", "codigo2": "texto2"}}}}

Historia clínica:
{descripcion}
""",                "role": "user"
            }
            ]
        }


            # Chat completion (POST /chat/completions)
            response = requests.post(
            "https://openrouter.ai/api/v1/chat/completions",
            headers={
                "Authorization": f"Bearer {OPENROUTERKEY}"
            },
            json=pregunta,
            )
            data = response.json()
            #print(data['choices'][0]['message']['content'])
            print("DEBUG RESPONSE:", data)

            
            print("Salida: ")
            print(data['choices'][0]['message']['content'])
            return data['choices'][0]['message']['content']
        except Exception as e:
           # return {{"resumen": "xxx", "diagnosticos": {{"codigo1": "texto", "codigo2": "texto2"}}, "procedimientos": {{"codigo1": "texto", "codigo2": "texto2"}}}}

            raise HTTPException(status_code=500, detail=f"Error en el análisis con el modelo: {str(e)}")

    @staticmethod
    def guardar_historia(descripcion: str, analisis: str):
        """Guarda el análisis en MongoDB"""
        try:
            documento = {
                "descripcion": descripcion,
                "analisis": analisis,
                "fecha_analisis": datetime.now(colombia_tz),
                "procesado_por": "oPENROUTER API",
                "modelo_utilizado": "llama3-70b-8192"
            }
            result = collection.insert_one(documento)
            return str(result.inserted_id)
        except Exception as e:
            raise HTTPException(status_code=500, detail=f"Error al guardar en MongoDB: {str(e)}")
