from decimal import Decimal
from datetime import date, datetime
from typing import Optional
from pydantic import BaseModel, Field

class OmieContaReceberBase(BaseModel):
    id: Optional[int] = Field(None, description="ID do registro")
    codigo_lancamento: Optional[str] = Field(None, description="Código do lançamento")
    codigo_cliente: Optional[str] = Field(None, description="Código do cliente")
    cnpj: Optional[str] = Field(None, description="CNPJ")
    data_vencimento: Optional[date] = Field(None, description="Data de vencimento")
    data_emissao: Optional[date] = Field(None, description="Data de emissão")
    valor: Optional[Decimal] = Field(None, description="Valor")
    status: Optional[str] = Field(None, description="Status")
    numero_documento: Optional[str] = Field(None, description="Número do documento")
    observacao: Optional[str] = Field(None, description="Observação")

    class Config:
        from_attributes = True
        validate_assignment = True

class OmieContaReceberResponse(OmieContaReceberBase):
    pass

class OmieContaReceberBoletoBase(BaseModel):
    id: Optional[int] = Field(None, description="ID do registro")
    codigo_lancamento: Optional[str] = Field(None, description="Código do lançamento")
    codigo_boleto: Optional[str] = Field(None, description="Código do boleto")
    nosso_numero: Optional[str] = Field(None, description="Nosso número")
    linha_digitavel: Optional[str] = Field(None, description="Linha digitável")
    codigo_barras: Optional[str] = Field(None, description="Código de barras")
    data_vencimento: Optional[date] = Field(None, description="Data de vencimento")
    valor: Optional[Decimal] = Field(None, description="Valor")
    status: Optional[str] = Field(None, description="Status")

    class Config:
        from_attributes = True
        validate_assignment = True

class OmieContaReceberBoletoResponse(OmieContaReceberBoletoBase):
    pass

class OmieBoletoCompletoResponse(BaseModel):
    """Schema combinado com dados do boleto e da conta a receber"""
    # Dados do boleto
    codigo_lancamento_omie: Optional[int] = Field(None, description="Código do lançamento Omie")
    data_emissao_boleto: Optional[date] = Field(None, description="Data de emissão do boleto (dDtEmBol)")
    numero_boleto: Optional[str] = Field(None, description="Número do boleto (cNumBoleto)")
    codigo_barras: Optional[str] = Field(None, description="Código de barras")
    link_boleto: Optional[str] = Field(None, description="Link do boleto")
    status_boleto: Optional[str] = Field(None, description="Status do boleto")
    descricao_status: Optional[str] = Field(None, description="Descrição do status")
    
    # Dados da conta a receber (empresa e vencimento)
    cnpj: Optional[str] = Field(None, description="CNPJ da empresa")
    data_vencimento: Optional[date] = Field(None, description="Data de vencimento do título")
    data_emissao: Optional[date] = Field(None, description="Data de emissão do título")
    valor_documento: Optional[Decimal] = Field(None, description="Valor do documento")
    numero_documento: Optional[str] = Field(None, description="Número do documento")
    status_titulo: Optional[str] = Field(None, description="Status do título")
    codigo_cliente_fornecedor: Optional[int] = Field(None, description="Código do cliente/fornecedor")
    data_pagamento: Optional[date] = Field(None, description="Data de pagamento do título")
    valor_pago: Optional[Decimal] = Field(None, description="Valor pago do título")
    pago: Optional[bool] = Field(None, description="Indica se o boleto foi pago (baseado em data_pagamento ou valor_pago > 0)")
    # Dados do cliente que pagou
    codigo_cliente_omie: Optional[int] = Field(None, description="Código do cliente no Omie (codigoClienteOmie)")
    cnpj_cliente: Optional[str] = Field(None, description="CNPJ/CPF do cliente que pagou")
    razao_social_cliente: Optional[str] = Field(None, description="Razão social do cliente que pagou")
    nome_fantasia_cliente: Optional[str] = Field(None, description="Nome fantasia do cliente que pagou")
    
    class Config:
        from_attributes = True
        validate_assignment = True

