"""
Modelos ORM para gestión de tenants
"""

import enum
from typing import TYPE_CHECKING, List

from api.v1.common.base_models import TimestampMixin
from core.database import Base
from sqlalchemy import Boolean, Column
from sqlalchemy import Enum as SQLEnum
from sqlalchemy import Integer, String, Text
from sqlalchemy.orm import Mapped, relationship

from api.v1.modules.core.user_tenant.models import UserTenant


class TenantType(enum.Enum):
    """Tipo de tenant según tamaño y necesidades"""

    SHARED = "shared"  # BD compartida
    DEDICATED = "dedicated"  # BD dedicada


class Tenant(Base, TimestampMixin):
    """
    Modelo de Tenant - Cliente/Organización en el sistema
    Cada tenant puede tener BD compartida o dedicada
    """

    __tablename__ = "tenants"
    __table_args__ = {"schema": "core", "extend_existing": True}

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String(255), nullable=False, index=True)
    slug = Column(String(100), unique=True, nullable=False, index=True)

    # Tipo de tenant (compartido o dedicado)
    type = Column(
        SQLEnum(TenantType),
        default=TenantType.SHARED,
        server_default="SHARED",
        nullable=False,
    )

    # Keycloak realm asociado
    keycloak_realm = Column(String(255), nullable=False)

    # Configuración de BD dedicada (JSON string o NULL si usa BD compartida)
    db_config = Column(Text, nullable=True)  # JSON: {host, port, name, user, password}

    # Información de contacto
    contact_name = Column(String(255))
    contact_email = Column(String(255))
    contact_phone = Column(String(50))

    # Estado
    is_active = Column(Boolean, default=True, server_default="true", nullable=False)

    # Relación con UserTenant
    user_relations: Mapped[List["UserTenant"]] = relationship(
        "UserTenant", back_populates="tenant"
    )

    def __repr__(self):
        return f"<Tenant(id={self.id}, name={self.name}, type={self.type.value})>"
