from datetime import datetime

import pytz

from app.core.logging import InstrumentedMongoCollection, get_logger
from app.core.mongo_runtime import get_mongo_runtime


colombia_tz = pytz.timezone("America/Bogota")
logger = get_logger(__name__)


class MongoDBStorage:
    def __init__(
        self,
        uri: str,
        db_name: str,
        collection_name: str,
        *,
        service: str = "mongo_storage",
        client=None,
        database=None,
    ):
        """
        Inicializa la conexión con MongoDB y selecciona la base de datos y colección.
        """
        runtime = get_mongo_runtime()
        self.client = client if client is not None else runtime.sync_client
        self.db = database if database is not None else runtime.sync_database
        self.collection = InstrumentedMongoCollection(self.db[collection_name], service=service)

    def guardar_pdf(self, nombre_archivo: str, contenido: str, usuario: str = "sistema"):
        """
        Guarda el texto extraído desde un PDF en la base de datos.
        """
        documento = {
            "usuario": usuario,
            "nombre_archivo": nombre_archivo,
            "contenido_pdf": contenido,
            "fecha_guardado": datetime.now(colombia_tz),
        }
        self.collection.insert_one(documento)
        logger.info("PDF stored in MongoDB for filename=%s", nombre_archivo)

    def guardar_analisis(
        self,
        descripcion: str,
        analisis_html: str,
        codigos_cie10: list,
        codigos_cups: list,
        usuario: str,
        nombre_archivo: str,
        *,
        nombre_paciente: str = "",
        analysis_document_id: str = "",
        case_key: str = "",
        case_number: str = "",
        batch_id: str = "",
        batch_file_id: str = "",
        ingestion_source: str = "manual",
        analysis_structured: dict | None = None,
        analysis_schema: str | None = None,
        analysis_schema_version: str | None = None,
        analysis_render_version: str | None = None,
    ) -> str:
        doc = {
            "usuario": usuario,
            "nombre_archivo": nombre_archivo,
            "descripcion": descripcion,
            "analisis_html": analisis_html,
            "codigos_cie10": codigos_cie10,
            "codigos_cups": codigos_cups,
            "fecha_analisis": datetime.now(colombia_tz),
            "nombre_paciente": nombre_paciente or "desconocido",
            "analysis_document_id": analysis_document_id,
            "case_key": case_key,
            "case_number": case_number,
            "batch_id": batch_id,
            "batch_file_id": batch_file_id,
            "ingestion_source": ingestion_source,
        }
        if analysis_structured:
            doc["analysis_structured"] = analysis_structured
            doc["analysis_schema"] = analysis_schema
            doc["analysis_schema_version"] = analysis_schema_version
            doc["analysis_render_version"] = analysis_render_version
        return str(self.collection.insert_one(doc).inserted_id)
