from datetime import datetime
from decimal import Decimal
from typing import Optional

from pydantic import BaseModel, ConfigDict, Field


class PedimentoIncrementablesBase(BaseModel):
    """Base schema for Pedimento Incrementables"""

    pedimento_id: Optional[int] = Field(None, description="Pedimento ID")
    tenant_id: Optional[int] = Field(None, description="Tenant ID")
    insured_value: Optional[Decimal] = Field(None, description="Insured value")
    freight: Optional[Decimal] = Field(None, description="Freight")
    insurance: Optional[Decimal] = Field(None, description="Insurance")
    packaging: Optional[Decimal] = Field(None, description="Packaging")
    others: Optional[Decimal] = Field(None, description="Others")
    deductibles: Optional[Decimal] = Field(None, description="Deductibles")
    currency: Optional[str] = Field(None, max_length=3, description="Currency")
    currency_factor: Optional[Decimal] = Field(None, description="Currency factor")
    not_affect_usd_value: Optional[int] = Field(
        None, description="Not affect USD value"
    )
    not_affect_customs_value: Optional[int] = Field(
        None, description="Not affect customs value"
    )


class PedimentoIncrementablesCreate(PedimentoIncrementablesBase):
    """Schema for creating a new Pedimento Incrementables"""

    pass


class PedimentoIncrementablesUpdate(BaseModel):
    """Schema for updating a Pedimento Incrementables"""

    insured_value: Optional[Decimal] = None
    freight: Optional[Decimal] = None
    insurance: Optional[Decimal] = None
    packaging: Optional[Decimal] = None
    others: Optional[Decimal] = None
    deductibles: Optional[Decimal] = None
    currency: Optional[str] = Field(None, max_length=3)
    currency_factor: Optional[Decimal] = None
    not_affect_usd_value: Optional[int] = None
    not_affect_customs_value: Optional[int] = None


class PedimentoIncrementablesResponse(PedimentoIncrementablesBase):
    """Schema for Pedimento Incrementables response"""

    id: int
    created_at: datetime

    model_config = ConfigDict(from_attributes=True)
