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

class OmieContratoBase(BaseModel):
    id: Optional[int] = Field(None, description="ID do registro")
    codigo_contrato: Optional[str] = Field(None, description="Código do contrato")
    codigo_cliente: Optional[str] = Field(None, description="Código do cliente")
    cnpj: Optional[str] = Field(None, description="CNPJ")
    data_inicio: Optional[date] = Field(None, description="Data de início")
    data_fim: Optional[date] = Field(None, description="Data de fim")
    valor: Optional[Decimal] = Field(None, description="Valor")
    status: Optional[str] = Field(None, description="Status")
    descricao: Optional[str] = Field(None, description="Descrição")

    class Config:
        from_attributes = True
        validate_assignment = True

class OmieContratoResponse(OmieContratoBase):
    pass

class OmieContratoServicoBase(BaseModel):
    id: Optional[int] = Field(None, description="ID do registro")
    codigo_contrato: Optional[str] = Field(None, description="Código do contrato")
    codigo_servico: Optional[str] = Field(None, description="Código do serviço")
    descricao: Optional[str] = Field(None, description="Descrição")
    valor: Optional[Decimal] = Field(None, description="Valor")
    quantidade: Optional[Decimal] = Field(None, description="Quantidade")

    class Config:
        from_attributes = True
        validate_assignment = True

class OmieContratoServicoResponse(OmieContratoServicoBase):
    pass

class OmieContratoDepartamentoBase(BaseModel):
    id: Optional[int] = Field(None, description="ID do registro")
    codigo_contrato: Optional[str] = Field(None, description="Código do contrato")
    codigo_departamento: Optional[str] = Field(None, description="Código do departamento")
    nome_departamento: Optional[str] = Field(None, description="Nome do departamento")
    descricao: Optional[str] = Field(None, description="Descrição")

    class Config:
        from_attributes = True
        validate_assignment = True

class OmieContratoDepartamentoResponse(OmieContratoDepartamentoBase):
    pass

class OmieContratoVencimentoBase(BaseModel):
    id: Optional[int] = Field(None, description="ID do registro")
    codigo_contrato: Optional[str] = Field(None, description="Código do contrato")
    data_vencimento: Optional[date] = Field(None, description="Data de vencimento")
    texto_vencimento: Optional[str] = Field(None, description="Texto do vencimento")
    status: Optional[str] = Field(None, description="Status")

    class Config:
        from_attributes = True
        validate_assignment = True

class OmieContratoVencimentoResponse(OmieContratoVencimentoBase):
    pass