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, require_env
import pytz


# Cliente de Groq
client_groq = Groq(api_key=require_env(config.GROQ_API_KEY, "GROQ_API_KEY"))

# 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 usando Groq"""
        try:
            chat_completion = client_groq.chat.completions.create(
                messages=[
                    {
                        "role": "system",
                        "content": "Eres un analista médico experto. Analiza la historia clínica enviada y proporciona un análisis resumido y estructurado. Dame al final un listado de los diagnosticos y procedimientos con sus respectivos códigos realizados al paciente. Considera que los códigos de los procedimientos son de 6 dígitos."
                          
                    },
                    {
                        "role": "user",
                                 "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}
"""     }
                ],
                model=config.GROQ_MODEL_RESUMEN,
                temperature=0.3
              
            )
            return chat_completion.choices[0].message.content
        except Exception as e:
            raise HTTPException(status_code=500, detail=f"Error en el análisis con Groq: {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": "Groq API real",
                "modelo_utilizado": config.GROQ_MODEL_RESUMEN
            }
            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)}")
