import os
from datetime import datetime
from fastapi import FastAPI, HTTPException, Request
from pydantic import BaseModel
from pymongo import MongoClient
import pytz

from groq import Groq
from app.config import config, require_env

# Tu clase CIE10Retriever (asegúrate de importarla correctamente)
from modules.processing.cie10.RANGES_HTML import CIE10Retriever
# --------------------------------------------------
# Inicializaciones globales
# --------------------------------------------------

app = FastAPI()

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

# Cliente 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"]

# Instancia del RAG retriever de CIE‑10
retriever = CIE10Retriever(
    faiss_index_path=os.getenv("CIE10_FAISS_INDEX", "faiss_principal_jerarquico"),
    estructura_json_path=os.getenv("CIE10_ESTRUCTURA_JSON", "cie10_estructura_completa.json"),
    groq_api_key=config.GROQ_API_KEY,
    groq_model=config.GROQ_MODEL_CUPS
)

# --------------------------------------------------
# Modelos Pydantic
# --------------------------------------------------

class HistoriaClinicaRequest(BaseModel):
    descripcion: str

    @staticmethod
    def analizar_historiaclinica(descripcion: str) -> str:
        """Analiza la historia clínica y extrae resumen, diagnósticos y procedimientos en HTML."""
        prompt = f"""
Eres un asistente médico experto en codificación clínica (CIE-10 y procedimientos CUPS). Analiza esta historia clínica:

**Tareas:**
1. **Resumen:** Extraer en 1 párrafo conciso
2. **Diagnósticos:**
   - Identificar TODOS los diagnósticos
3. **Procedimientos:**
   - Extraer SOLO códigos de 6 dígitos exactos
   - Ignorar cualquier otro formato numérico
   - Validar que sean códigos válidos (rango 000000-999999)
4. **Formato de salida:**
<p><b>Resumen</b></p>
<p>[Texto del resumen]</p>

<p><b>Diagnósticos</b></p>
<ol>
[Lista de diagnósticos con códigos]
</ol>

<p><b>Procedimientos</b></p>
<ol>
[Lista de códigos de 6 dígitos]
</ol>

**Historia clínica:**
{descripcion}
"""

        try:
            resp = client_groq.chat.completions.create(
                model=config.GROQ_MODEL_RESUMEN,
                temperature=0.1,
                messages=[
                    {"role": "system", "content": "Eres un analista médico experto. Usa HTML válido."},
                    {"role": "user", "content": prompt}
                ],
            )
            return resp.choices[0].message.content
        except Exception as e:
            raise HTTPException(status_code=500, detail=f"Error en Groq: {e}")

    @staticmethod
    def guardar_historia(descripcion: str, analisis: str) -> str:
        """Guarda la historia y su análisis en MongoDB y devuelve el ID."""
        try:
            documento = {
                "descripcion": descripcion,
                "analisis_html": 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 guardando en MongoDB: {e}")



