from decimal import Decimal
from datetime import datetime
from typing import Optional, Union
from pydantic import BaseModel, Field, field_validator

class ClienteBase(BaseModel):
    Id: Optional[int] = Field(None, description="ID do cliente")
    Token: Optional[str] = Field(None, description="Token do cliente")
    RazaoSocial: Optional[str] = Field(None, description="Razão social")
    NomeFantasia: Optional[str] = Field(None, description="Nome fantasia")
    Cnpj: Optional[str] = Field(None, description="CNPJ")
    IdRegimeTributario: Optional[int] = Field(None, description="ID do regime tributário")
    IdEstado: Optional[int] = Field(None, description="ID do estado")
    ContatoOperacional: Optional[str] = Field(None, description="Contato operacional")
    EmailOperacional: Optional[str] = Field(None, description="Email operacional")
    TelefoneOperacional: Optional[str] = Field(None, description="Telefone operacional")
    CelularOperacional: Optional[str] = Field(None, description="Celular operacional")
    ContatoFinanceiro: Optional[str] = Field(None, description="Contato financeiro")
    EmailCobranca: Optional[str] = Field(None, description="Email de cobrança")
    Telefone: Optional[str] = Field(None, description="Telefone")
    Celular: Optional[str] = Field(None, description="Celular")
    NumeroLojas: Optional[int] = Field(None, description="Número de lojas")
    Endereco: Optional[str] = Field(None, description="Endereço")
    EnderecoNumero: Optional[str] = Field(None, description="Número do endereço")
    EnderecoComplemento: Optional[str] = Field(None, description="Complemento do endereço")
    Cep: Optional[str] = Field(None, description="CEP")
    Bairro: Optional[str] = Field(None, description="Bairro")
    Cidade: Optional[str] = Field(None, description="Cidade")
    InscricaoEstadual: Optional[str] = Field(None, description="Inscrição estadual")
    Site: Optional[str] = Field(None, description="Site")
    NomeRede: Optional[str] = Field(None, description="Nome da rede")
    ContatoRede: Optional[str] = Field(None, description="Contato da rede")
    TelefoneRede: Optional[str] = Field(None, description="Telefone da rede")
    IdRetaguarda: Optional[int] = Field(None, description="ID da retaguarda")
    Prospeccao: Optional[bool] = Field(None, description="Prospecção")
    Parceiro: Optional[bool] = Field(None, description="Parceiro")
    IdSegmentoCliente: Optional[int] = Field(None, description="ID do segmento do cliente")
    IdUsuarioUltimoDownloadRevisaoFiscal: Optional[int] = Field(None, description="ID do usuário do último download de revisão fiscal")
    DataUltimoDownloadRevisaoFiscal: Optional[datetime] = Field(None, description="Data do último download de revisão fiscal")
    IdUsuarioUltimoDownloadRevisaoFiscalCancelado: Optional[int] = Field(None, description="ID do usuário do último download de revisão fiscal cancelado")
    DataUltimoDownloadRevisaoFiscalCancelado: Optional[datetime] = Field(None, description="Data do último download de revisão fiscal cancelado")
    BaixarRevisaoSomenteCodigoInterno: Optional[bool] = Field(None, description="Baixar revisão somente código interno")
    OcultarDescricoesProdutosDownloadRevisao: Optional[bool] = Field(None, description="Ocultar descrições de produtos no download de revisão")
    NomeProprietario: Optional[str] = Field(None, description="Nome do proprietário")
    EmailProprietario: Optional[str] = Field(None, description="Email do proprietário")
    TelefoneProprietario: Optional[str] = Field(None, description="Telefone do proprietário")
    EmailCpd: Optional[str] = Field(None, description="Email CPD")
    RevisadoManualmente: Optional[bool] = Field(None, description="Revisado manualmente")
    IdContador: Optional[int] = Field(None, description="ID do contador")
    LimiteConsultaItensSemanalDiarioWsClientesAntigos: Optional[int] = Field(None, description="Limite de consulta de itens semanal diário WS clientes antigos")
    LimiteConsultaItensDiarioWsClientesNovos: Optional[int] = Field(None, description="Limite de consulta de itens diário WS clientes novos")
    IdUsuarioSuporteResponsavel: Optional[int] = Field(None, description="ID do usuário de suporte responsável")
    IdVendedor: Optional[int] = Field(None, description="ID do vendedor")
    PercentualCustoOperacional: Optional[Decimal] = Field(None, description="Percentual de custo operacional")
    DataExpiracaoCalculadora: Optional[datetime] = Field(None, description="Data de expiração da calculadora")
    NumeroCheckout: Optional[int] = Field(None, description="Número de checkout")
    NumeroFuncionarios: Optional[int] = Field(None, description="Número de funcionários")
    FaturamentoMensal: Optional[Decimal] = Field(None, description="Faturamento mensal")
    MetrosQuadradosLoja: Optional[Decimal] = Field(None, description="Metros quadrados da loja")
    IdClienteCrm: Optional[int] = Field(None, description="ID do cliente CRM")
    MesorregiaoEndereco: Optional[str] = Field(None, description="Mesorregião do endereço")
    IdGrupoEmpresarial: Optional[int] = Field(None, description="ID do grupo empresarial")
    EmailResponsavelRede: Optional[str] = Field(None, description="Email do responsável da rede")
    CnaePrimario: Optional[str] = Field(None, description="CNAE primário")
    CnaeSecundario: Optional[str] = Field(None, description="CNAE secundário")
    Instagram: Optional[str] = Field(None, description="Instagram")
    Facebook: Optional[str] = Field(None, description="Facebook")
    DataCriacaoProspeccao: Optional[datetime] = Field(None, description="Data de criação da prospecção")
    Observacoes: Optional[str] = Field(None, description="Observações")
    IdFilialRetaguarda: Optional[int] = Field(None, description="ID da filial retaguarda")
    TokenAtacado: Optional[str] = Field(None, description="Token atacado")
    TokenIndustria: Optional[str] = Field(None, description="Token indústria")
    IdOrigemCadastro: Optional[int] = Field(None, description="ID da origem do cadastro")
    IdStatusCliente: Optional[int] = Field(None, description="ID do status do cliente")
    TokenVarejo: Optional[str] = Field(None, description="Token varejo")
    Integration: Optional[str] = Field(None, description="Integração")
    Tipo: Optional[str] = Field(None, description="Tipo")
    IdRegimeEspecial: Optional[int] = Field(None, description="ID do regime especial")

    @field_validator('Tipo', mode='before')
    @classmethod
    def convert_tipo_to_string(cls, v):
        """Converte Tipo de int para string se necessário"""
        if v is None:
            return None
        if isinstance(v, (int, float)):
            return str(v)
        return v

    class Config:
        from_attributes = True
        validate_assignment = True

class ClienteResponse(ClienteBase):
    pass

