from src.Security.GenerarIDs import GeneradorIDUnico
from src.Llms.Embedders.Base_Embedder import EmbedderABC  # Asegúrate de que esta ruta sea correcta
from typing import List, Optional
from src.ConexionSql.Base_conexion import ConexionBase
from sqlalchemy import MetaData  # Asegúrate de importar esto
from src.TextManager.notas_mmr import generar_tabla_nota_para_biblioteca  # Ajusta si es necesario
from sqlalchemy import inspect
from src.base import Base


class Biblioteca:
    def __init__(
        self,
        nombre: str,
        descripcion: str = "",
        id: Optional[str] = None,
        embedder: Optional[EmbedderABC] = None,
        vector_dim: Optional[int] = None
    ):
        """
        Clase que representa una biblioteca de notas de texto.

        :param nombre: Nombre de la biblioteca.
        :param descripcion: Breve descripción de la biblioteca.
        :param id: ID único opcional. Si no se proporciona, se genera automáticamente.
        :param embedder: Objeto que implementa EmbedderABC para generar el vector del nombre.
        :param vector_dim: Dimensión del vector si no se proporciona un embedder.
        """
        self.id = id if id is not None else GeneradorIDUnico("BBLI").generar()
        self.nombre = nombre if "biblio" in nombre else f"biblio_{nombre}"
        self.descripcion = descripcion
        self.embedder = embedder

        if self.embedder is not None:
            self.vector_dim = self.embedder.dimension_number()
        elif vector_dim is not None:
            self.vector_dim = vector_dim
        else:
            raise ValueError("Debes proporcionar un 'embedder' o un 'vector_dim' explícito.")

    def generar_modelo_notas(self, conexion: ConexionBase):
        nombre_tabla = f"{self.nombre}"
        print(f"[Notas] Generando tabla: {nombre_tabla}")
        
        engine = conexion.get_engine()
        inspector = inspect(engine)

        if inspector.has_table(nombre_tabla):
            print(f"[Notas] ❌ Ya existe la tabla {nombre_tabla}")
            raise ValueError(f"Ya existe una tabla con el nombre '{nombre_tabla}' en la base de datos.")

        print("[Notas] Generando definición SQL...")
        tabla, NotaModel = generar_tabla_nota_para_biblioteca(nombre_tabla, self.vector_dim, Base.metadata)

        print("[Notas] Creando tabla en base de datos...")
        Base.metadata.create_all(engine)
        print("[Notas] ✔️ Tabla creada")

        return NotaModel