"""Modelo de catálogos de referencia del CRM (T2026-07-081/082).

Un único modelo genérico ``CatalogItem`` respalda todos los catálogos
(SAT/ISO y los propios del cliente). Cada fila pertenece a un catálogo
(``catalog``) e identifica una opción por ``code`` (clave) + ``label``
(descripción que se visualiza).

Alcance:
- ``tenant_id IS NULL`` → catálogo GLOBAL (Aduanasoft), compartido por todos.
- ``tenant_id`` con valor → catálogo del CLIENTE (ese tenant lo administra).

Los catálogos dependientes (p. ej. Estado depende de País) usan
``parent_catalog`` + ``parent_code`` para filtrarse.
"""

from datetime import datetime

from sqlalchemy import JSON, Boolean, DateTime, Integer, String, text
from sqlalchemy.orm import Mapped, mapped_column
from sqlalchemy.sql import func

from core.database import Base


class CatalogItem(Base):
    __tablename__ = "catalog_items"
    __table_args__ = {"schema": "crm"}

    id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True)

    catalog: Mapped[str] = mapped_column(String(60), nullable=False, index=True)
    code: Mapped[str] = mapped_column(String(64), nullable=False)
    label: Mapped[str] = mapped_column(String(255), nullable=False)

    # Dependencia (Estado→País, Municipio→Estado, …)
    parent_catalog: Mapped[str | None] = mapped_column(String(60), nullable=True)
    parent_code: Mapped[str | None] = mapped_column(String(64), nullable=True)

    # NULL = global (Aduanasoft); con valor = catálogo propio del tenant (cliente).
    tenant_id: Mapped[int | None] = mapped_column(Integer, nullable=True, index=True)

    sort_order: Mapped[int] = mapped_column(Integer, nullable=False, server_default=text("0"))
    is_active: Mapped[bool] = mapped_column(Boolean, nullable=False, server_default=text("true"))
    # Catálogos base SAT/ISO: no se pueden borrar (solo activar/desactivar).
    is_system: Mapped[bool] = mapped_column(Boolean, nullable=False, server_default=text("false"))

    extra: Mapped[dict | None] = mapped_column(JSON, nullable=True)

    created_by: Mapped[str | None] = mapped_column(String(64), nullable=True)
    updated_by: Mapped[str | None] = mapped_column(String(64), nullable=True)
    created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.now())
    updated_at: Mapped[datetime] = mapped_column(
        DateTime, nullable=False, server_default=func.now(), onupdate=func.now()
    )
