from __future__ import annotations

from typing import List, Optional

from pydantic import BaseModel, ConfigDict, Field, constr


class EmpresasSociosCreate(BaseModel):
    """Payload para criar sócio vinculado a uma empresa."""

    empresas_dados_id: constr(strip_whitespace=True, min_length=1) = Field(
        ..., description="ID do registro em 'empresas-dados' (relacionamento many-to-one)."
    )
    nome: constr(strip_whitespace=True, min_length=1, max_length=255) = Field(
        ..., description="Nome do sócio."
    )
    qualificacao: constr(strip_whitespace=True, min_length=1, max_length=255) = Field(
        ..., description="Qualificação do sócio (ex.: '10-Diretor')."
    )
    data_entrada: Optional[constr(strip_whitespace=True)] = Field(
        None,
        description="Data de entrada na sociedade (AAAA-MM-DD ou string original).",
    )
    faixa_etaria: Optional[constr(strip_whitespace=True, max_length=50)] = Field(
        None, description="Faixa etária do sócio."
    )
    identificador: Optional[constr(strip_whitespace=True, max_length=255)] = Field(
        None, description="Identificador do sócio no QSA (quando existir)."
    )

    model_config = ConfigDict(
        json_schema_extra={
            "example": {
                "empresas_dados_id": "emp-dados_123",
                "nome": "Maria de Souza Lima",
                "qualificacao": "10-Diretor",
                "data_entrada": "2014-03-12",
                "faixa_etaria": "31-40",
                "identificador": "12345678901",
            }
        }
    )


class EmpresasSociosUpdate(BaseModel):
    """Payload para atualização parcial do sócio."""

    empresas_dados_id: Optional[constr(strip_whitespace=True, min_length=1)] = None
    nome: Optional[constr(strip_whitespace=True, min_length=1, max_length=255)] = None
    qualificacao: Optional[constr(strip_whitespace=True, min_length=1, max_length=255)] = None
    data_entrada: Optional[constr(strip_whitespace=True)] = None
    faixa_etaria: Optional[constr(strip_whitespace=True, max_length=50)] = None
    identificador: Optional[constr(strip_whitespace=True, max_length=255)] = None

    model_config = ConfigDict(
        json_schema_extra={
            "example": {
                "nome": "Maria S. Lima",
                "qualificacao": "16-Sócio",
                "faixa_etaria": "41-50",
            }
        }
    )


class EmpresasSociosOut(BaseModel):
    """Representação do sócio retornada pela API."""

    id: str = Field(..., alias="$id")
    empresas_dados_id: Optional[str] = None
    nome: str
    qualificacao: str
    data_entrada: Optional[str] = None
    faixa_etaria: Optional[str] = None
    identificador: Optional[str] = None
    created_at: Optional[str] = Field(None, alias="$createdAt")
    updated_at: Optional[str] = Field(None, alias="$updatedAt")

    model_config = ConfigDict(
        populate_by_name=True,
        json_schema_extra={
            "example": {
                "id": "soc_1",
                "empresas_dados_id": "emp-dados_123",
                "nome": "Maria de Souza Lima",
                "qualificacao": "10-Diretor",
                "data_entrada": "2014-03-12",
                "faixa_etaria": "31-40",
                "identificador": "12345678901",
                "created_at": "2024-10-01T10:00:00.000Z",
                "updated_at": "2024-10-01T10:00:00.000Z",
            }
        },
    )


class PaginatedEmpresasSocios(BaseModel):
    """Envelope padrão de paginação para sócios."""

    items: List[EmpresasSociosOut]
    total: int

    model_config = ConfigDict(
        json_schema_extra={
            "example": {
                "items": [
                    {
                        "id": "soc_1",
                        "empresas_dados_id": "emp-dados_123",
                        "nome": "Maria de Souza Lima",
                        "qualificacao": "10-Diretor",
                        "data_entrada": "2014-03-12",
                        "faixa_etaria": "31-40",
                        "identificador": "12345678901",
                        "created_at": "2024-10-01T10:00:00.000Z",
                        "updated_at": "2024-10-01T10:00:00.000Z",
                    }
                ],
                "total": 1,
            }
        }
    )
