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_CIE10
)

# --------------------------------------------------
# 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 de procesamiento de texto médico. Se te proporcionará una historia clínica completa.

Tu tarea es:
1. PRIMERO, identificar y extraer el nombre completo del paciente del documento.
2. Extraer el <b>Resumen</b> en un párrafo.
3. Dame los <b>Diagnósticos</b> realizados al paciente con sus respectivos códigos bajo el encabezado "Diagnósticos".
4. Dame los Procedimientos realizados al paciente con sus respectivos códigos. Considera que los códigos de los procedimientos aparecen al final Y son de 6 dígitos, donde están en la parte de: "Ordenes Generadas en Historias Clínicas".

5. Salida en HTML (IMPORTANTE: El nombre del paciente debe ser exacto como aparece en el documento):
   <p><b>Nombre del paciente</b></p>
   <p>[Nombre completo real extraído del documento]</p>
   <p><b>Resumen</b></p>
   <p>…</p>
   <p><b>Diagnósticos</b></p>
   <ol><li>…</li></ol>
   <p><b>Procedimientos</b></p>
   <ol><li>…</li></ol>

Historia clínica:
{descripcion}
"""
        try:
            resp = client_groq.chat.completions.create(
                model=config.GROQ_MODEL_RESUMEN,
                temperature=0.0,
                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}")

# --------------------------------------------------
# Endpoint único: extracción + guardado + CIE‑10
# --------------------------------------------------

