"""
DTOs (Data Transfer Objects) para módulo de clases de activos fijos (FA)
"""

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

from pydantic import BaseModel, ConfigDict, Field


class FAClassCreateDTO(BaseModel):
    """DTO para crear una clase de activo fijo"""

    class_id: int = Field(..., description="ID de la clase base en a76.classes")
    
    import_tariff_code: Optional[str] = Field(
        None, max_length=10, description="Código de fracción de importación"
    )
    import_tariff_type: Optional[str] = Field(
        None, max_length=6, description="Tipo de fracción de importación"
    )
    export_tariff_code: Optional[str] = Field(
        None, max_length=10, description="Código de fracción de exportación"
    )
    export_tariff_type: Optional[str] = Field(
        None, max_length=6, description="Tipo de fracción de exportación"
    )
    depreciation_rate: Optional[Decimal] = Field(
        None, description="Tasa de depreciación anual", ge=0, le=100
    )
    fda_code: Optional[str] = Field(
        None, max_length=20, description="Código FDA"
    )
    eccn_code: Optional[str] = Field(
        None, max_length=20, description="Código ECCN (Export Control Classification Number)"
    )
    class_enabled: Optional[bool] = Field(
        True, description="Indica si la clase está habilitada"
    )

    class Config:
        from_attributes = True


class FAClassUpdateDTO(BaseModel):
    """DTO para actualizar una clase de activo fijo"""

    import_tariff_code: Optional[str] = Field(
        None, max_length=10, description="Código de fracción de importación"
    )
    import_tariff_type: Optional[str] = Field(
        None, max_length=6, description="Tipo de fracción de importación"
    )
    export_tariff_code: Optional[str] = Field(
        None, max_length=10, description="Código de fracción de exportación"
    )
    export_tariff_type: Optional[str] = Field(
        None, max_length=6, description="Tipo de fracción de exportación"
    )
    depreciation_rate: Optional[Decimal] = Field(
        None, description="Tasa de depreciación anual", ge=0, le=100
    )
    fda_code: Optional[str] = Field(
        None, max_length=20, description="Código FDA"
    )
    eccn_code: Optional[str] = Field(
        None, max_length=20, description="Código ECCN"
    )
    class_enabled: Optional[bool] = Field(
        None, description="Indica si la clase está habilitada"
    )

    class Config:
        from_attributes = True


class FAClassResponseDTO(BaseModel):
    """DTO para respuesta de clase de activo fijo"""

    id: int
    tenant_id: int
    company_id: int
    class_id: int
    import_tariff_code: Optional[str] = None
    import_tariff_type: Optional[str] = None
    export_tariff_code: Optional[str] = None
    export_tariff_type: Optional[str] = None
    depreciation_rate: Optional[Decimal] = None
    fda_code: Optional[str] = None
    eccn_code: Optional[str] = None
    class_enabled: Optional[bool] = None
    created_at: datetime
    updated_at: datetime

    model_config = ConfigDict(from_attributes=True)


class FAClassListResponseDTO(BaseModel):
    """DTO para respuesta de lista paginada de clases de activos fijos"""

    items: list[FAClassResponseDTO]
    total: int
    page: int
    page_size: int

    model_config = ConfigDict(from_attributes=True)
