"""
DTOs (Data Transfer Objects) para líneas de activos fijos (FA Item Lines)
"""

from datetime import datetime
from typing import Optional

from pydantic import BaseModel, ConfigDict, Field


class FaLineItemCreateDTO(BaseModel):
    """DTO para crear una línea de activo fijo"""

    # line_item_id references the id in a76.item_lines
    # Not required on creation - will be set when the LineItem is created
    line_item_id: Optional[int] = Field(None, description="ID de la línea base en a76.item_lines")

    # Asset information (SCAF specific)
    asset_number: Optional[str] = Field(
        None, max_length=25, description="Número de activo"
    )
    asset_photo: Optional[str] = Field(
        None, max_length=255, description="Foto del activo fijo"
    )
    equipment_message: Optional[str] = Field(
        None, max_length=40, description="Mensaje del equipo"
    )
    invoice_type_asset: Optional[str] = Field(
        None, max_length=6, description="Tipo de factura para activo"
    )
    return_import_invoice: Optional[str] = Field(
        None, max_length=15, description="Factura de importación de retorno"
    )
    return_import_date: Optional[int] = Field(
        None, description="Fecha de factura de importación de retorno"
    )
    movement_type_import: Optional[str] = Field(
        None, max_length=3, description="Tipo de movimiento de importación"
    )

    # Cross-references for import repair
    search_invoice: Optional[str] = Field(
        None, max_length=15, description="Factura de búsqueda cruzada"
    )
    search_line: Optional[int] = Field(None, description="Línea de búsqueda cruzada")

    # Search type
    search_type: Optional[str] = Field(
        None, max_length=10, description="Tipo de búsqueda"
    )

    # Subitems
    is_subitem: Optional[bool] = Field(False, description="Es subpartida")
    contains_subitems: Optional[bool] = Field(False, description="Contiene subpartidas")
    includes_subitems: Optional[bool] = Field(False, description="Incluye subpartidas")
    subitem_number: Optional[int] = Field(0, description="Número de subpartida")

    # Special flags
    discharge: Optional[bool] = Field(None, description="Indicador de descarga")
    own_equipment: Optional[bool] = Field(None, description="Equipo propio")
    omit_annex31: Optional[bool] = Field(None, description="Omitir en Anexo 31")

    model_config = ConfigDict(from_attributes=True)


class FaLineItemUpdateDTO(BaseModel):
    """DTO para actualizar una línea de activo fijo"""

    # Asset information (SCAF specific)
    asset_number: Optional[str] = Field(
        None, max_length=25, description="Número de activo"
    )
    asset_photo: Optional[str] = Field(
        None, max_length=255, description="Foto del activo fijo"
    )
    equipment_message: Optional[str] = Field(
        None, max_length=40, description="Mensaje del equipo"
    )
    invoice_type_asset: Optional[str] = Field(
        None, max_length=6, description="Tipo de factura para activo"
    )
    return_import_invoice: Optional[str] = Field(
        None, max_length=15, description="Factura de importación de retorno"
    )
    return_import_date: Optional[int] = Field(
        None, description="Fecha de factura de importación de retorno"
    )
    movement_type_import: Optional[str] = Field(
        None, max_length=3, description="Tipo de movimiento de importación"
    )

    # Cross-references for import repair
    search_invoice: Optional[str] = Field(
        None, max_length=15, description="Factura de búsqueda cruzada"
    )
    search_line: Optional[int] = Field(None, description="Línea de búsqueda cruzada")

    # Search type
    search_type: Optional[str] = Field(
        None, max_length=10, description="Tipo de búsqueda"
    )

    # Subitems
    is_subitem: Optional[bool] = Field(False, description="Es subpartida")
    contains_subitems: Optional[bool] = Field(False, description="Contiene subpartidas")
    includes_subitems: Optional[bool] = Field(False, description="Incluye subpartidas")
    subitem_number: Optional[int] = Field(None, description="Número de subpartida")

    # Special flags
    discharge: Optional[bool] = Field(None, description="Indicador de descarga")
    own_equipment: Optional[bool] = Field(None, description="Equipo propio")
    omit_annex31: Optional[bool] = Field(None, description="Omitir en Anexo 31")

    model_config = ConfigDict(from_attributes=True)


class FaLineItemResponseDTO(BaseModel):
    """DTO para respuesta de línea de activo fijo"""

    id: int = Field(..., description="ID de la línea de activo fijo")
    tenant_id: int = Field(..., description="ID del tenant")
    company_id: int = Field(..., description="ID de la empresa")

    # Asset information (SCAF specific)
    asset_number: Optional[str] = Field(None, description="Número de activo")
    asset_photo: Optional[str] = Field(None, description="Foto del activo fijo")
    equipment_message: Optional[str] = Field(None, description="Mensaje del equipo")
    invoice_type_asset: Optional[str] = Field(
        None, description="Tipo de factura para activo"
    )
    return_import_invoice: Optional[str] = Field(
        None, description="Factura de importación de retorno"
    )
    return_import_date: Optional[int] = Field(
        None, description="Fecha de factura de importación de retorno"
    )
    movement_type_import: Optional[str] = Field(
        None, description="Tipo de movimiento de importación"
    )

    # Cross-references for import repair
    search_invoice: Optional[str] = Field(
        None, description="Factura de búsqueda cruzada"
    )
    search_line: Optional[int] = Field(None, description="Línea de búsqueda cruzada")

    # Search type
    search_type: Optional[str] = Field(None, description="Tipo de búsqueda")

    # Subitems
    is_subitem: Optional[bool] = Field(False, description="Es subpartida")
    contains_subitems: Optional[bool] = Field(False, description="Contiene subpartidas")
    includes_subitems: Optional[bool] = Field(False, description="Incluye subpartidas")
    subitem_number: Optional[int] = Field(None, description="Número de subpartida")

    # Special flags
    discharge: Optional[bool] = Field(None, description="Indicador de descarga")
    own_equipment: Optional[bool] = Field(None, description="Equipo propio")
    omit_annex31: Optional[bool] = Field(None, description="Omitir en Anexo 31")

    # Timestamps
    created_at: datetime = Field(..., description="Fecha de creación")
    updated_at: datetime = Field(..., description="Fecha de actualización")

    model_config = ConfigDict(from_attributes=True)
