from __future__ import annotations

from typing import List, Optional

from pydantic import AliasChoices, BaseModel, ConfigDict, Field


class UsuarioEmpresaPerfilBase(BaseModel):
    usuarioId: str = Field(
        min_length=1,
        max_length=255,
        description="Identificador do usuário relacionado",
        validation_alias=AliasChoices("usuarios", "usuarioId", "usuario_id"),
        serialization_alias="usuarios",
        examples=["usuario_01"],
    )
    empresaId: str = Field(
        min_length=1,
        max_length=255,
        description="Identificador da empresa vinculada",
        validation_alias=AliasChoices("empresas-dados", "empresaId", "empresa_id", "empresas"),
        serialization_alias="empresas-dados",
        examples=["empresa_01"],
    )
    perfilId: str = Field(
        min_length=1,
        max_length=255,
        description="Identificador do perfil atribuído",
        validation_alias=AliasChoices("usuario-perfis", "perfilId", "usuario_perfil_id"),
        serialization_alias="usuario-perfis",
        examples=["perfil_admin"],
    )

    model_config = ConfigDict(populate_by_name=True)


class UsuarioEmpresaPerfilCreate(UsuarioEmpresaPerfilBase):
    """Payload de criação para vínculos usuário-empresa-perfil."""


class UsuarioEmpresaPerfilUpdate(BaseModel):
    usuarioId: str | None = Field(
        default=None,
        min_length=1,
        max_length=255,
        description="Identificador do usuário relacionado",
        validation_alias=AliasChoices("usuarios", "usuarioId", "usuario_id"),
        serialization_alias="usuarios",
    )
    empresaId: str | None = Field(
        default=None,
        min_length=1,
        max_length=255,
        description="Identificador da empresa vinculada",
        validation_alias=AliasChoices("empresas-dados", "empresaId", "empresa_id", "empresas"),
        serialization_alias="empresas-dados",
    )
    perfilId: str | None = Field(
        default=None,
        min_length=1,
        max_length=255,
        description="Identificador do perfil atribuído",
        validation_alias=AliasChoices("usuario-perfis", "perfilId", "usuario_perfil_id"),
        serialization_alias="usuario-perfis",
    )

    model_config = ConfigDict(populate_by_name=True)


class RelacionamentoOut(BaseModel):
    id: str
    nome: Optional[str] = None

    model_config = ConfigDict(
        json_schema_extra={"example": {"id": "usuario_01", "nome": "admin@saveinmed.com"}}
    )


class UsuarioEmpresaPerfilOut(BaseModel):
    id: str
    usuarioId: str = Field(
        validation_alias=AliasChoices("usuarioId", "usuarios"),
        serialization_alias="usuarioId",
    )
    empresaId: str = Field(
        validation_alias=AliasChoices("empresaId", "empresas-dados", "empresas"),
        serialization_alias="empresaId",
    )
    perfilId: str = Field(
        validation_alias=AliasChoices("perfilId", "usuario-perfis"),
        serialization_alias="perfilId",
    )
    usuario: RelacionamentoOut
    empresa: RelacionamentoOut
    perfil: RelacionamentoOut
    createdAt: str
    updatedAt: str

    model_config = ConfigDict(
        from_attributes=True,
        populate_by_name=True,
        json_schema_extra={
            "example": {
                "id": "vinculo_01",
                "usuarioId": "usuario_01",
                "empresaId": "empresa_01",
                "perfilId": "perfil_admin",
                "usuario": {"id": "usuario_01", "nome": "admin@saveinmed.com"},
                "empresa": {"id": "empresa_01", "nome": "Farmácia Central"},
                "perfil": {"id": "perfil_admin", "nome": "Administrador"},
                "createdAt": "2025-01-15T12:00:00.000Z",
                "updatedAt": "2025-01-15T12:00:00.000Z",
            }
        },
    )


class PaginatedUsuarioEmpresaPerfis(BaseModel):
    items: List[UsuarioEmpresaPerfilOut]
    total: int

    model_config = ConfigDict(
        json_schema_extra={
            "example": {
                "items": [
                    {
                        "id": "vinculo_01",
                        "usuarioId": "usuario_01",
                        "empresaId": "empresa_01",
                        "perfilId": "perfil_admin",
                        "usuario": {"id": "usuario_01", "nome": "admin@saveinmed.com"},
                        "empresa": {"id": "empresa_01", "nome": "Farmácia Central"},
                        "perfil": {"id": "perfil_admin", "nome": "Administrador"},
                        "createdAt": "2025-01-15T12:00:00.000Z",
                        "updatedAt": "2025-01-15T12:00:00.000Z",
                    }
                ],
                "total": 1,
            }
        }
    )
