"""
Inventory DTOs — Data Transfer Objects.

DTO‌ها برای انتقال داده بین لایه‌ها و API.
"""
from dataclasses import dataclass, field
from datetime import date, datetime
from decimal import Decimal
from typing import Optional, List
from uuid import UUID

from shared.dto.base import BaseDTO


# ─────────────────────────────────────────────
# Item Type DTOs
# ─────────────────────────────────────────────

@dataclass
class CreateItemTypeDTO(BaseDTO):
    """DTO ایجاد نوع کالا."""
    type_code: str = ""
    type_name: str = ""
    description: str = ""
    is_stockable: bool = True
    is_purchasable: bool = True
    is_sellable: bool = True
    is_manufactured: bool = False


@dataclass
class ItemTypeResponseDTO(BaseDTO):
    """DTO پاسخ نوع کالا."""
    id: UUID = None
    type_code: str = ""
    type_name: str = ""
    is_stockable: bool = True
    is_active: bool = True


# ─────────────────────────────────────────────
# Item Group DTOs
# ─────────────────────────────────────────────

@dataclass
class CreateItemGroupDTO(BaseDTO):
    """DTO ایجاد گروه کالا."""
    group_code: str = ""
    group_name: str = ""
    parent_group_id: Optional[UUID] = None
    description: str = ""


@dataclass
class ItemGroupResponseDTO(BaseDTO):
    """DTO پاسخ گروه کالا."""
    id: UUID = None
    group_code: str = ""
    group_name: str = ""
    parent_group_id: Optional[UUID] = None
    is_active: bool = True


# ─────────────────────────────────────────────
# UOM DTOs
# ─────────────────────────────────────────────

@dataclass
class CreateUOMDTO(BaseDTO):
    """DTO ایجاد واحد اندازه‌گیری."""
    uom_code: str = ""
    uom_name: str = ""
    uom_type: str = "QUANTITY"
    symbol: str = ""


@dataclass
class UOMResponseDTO(BaseDTO):
    """DTO پاسخ واحد."""
    id: UUID = None
    uom_code: str = ""
    uom_name: str = ""
    symbol: str = ""
    is_active: bool = True


# ─────────────────────────────────────────────
# Item DTOs
# ─────────────────────────────────────────────

@dataclass
class CreateItemDTO(BaseDTO):
    """DTO ایجاد کالا."""
    item_code: str = ""
    item_name: str = ""
    item_name_en: str = ""
    item_type_id: Optional[UUID] = None
    item_group_id: Optional[UUID] = None
    base_uom_id: Optional[UUID] = None
    barcode: str = ""
    description: str = ""
    brand: str = ""
    model: str = ""
    manufacturer: str = ""
    is_batch_tracked: bool = False
    is_serial_tracked: bool = False
    shelf_life_days: int = 0
    min_order_qty: str = "0"
    max_order_qty: str = "0"
    reorder_point: str = "0"
    safety_stock: str = "0"
    default_warehouse_id: Optional[UUID] = None
    abc_classification: str = "C"
    weight_kg: str = "0"
    volume_cbm: str = "0"


@dataclass
class UpdateItemDTO(BaseDTO):
    """DTO بروزرسانی کالا."""
    item_name: Optional[str] = None
    item_name_en: Optional[str] = None
    description: Optional[str] = None
    brand: Optional[str] = None
    model: Optional[str] = None
    barcode: Optional[str] = None
    reorder_point: Optional[str] = None
    safety_stock: Optional[str] = None
    abc_classification: Optional[str] = None
    is_active: Optional[bool] = None


@dataclass
class ItemResponseDTO(BaseDTO):
    """DTO پاسخ کالا."""
    id: UUID = None
    item_code: str = ""
    item_name: str = ""
    item_name_en: str = ""
    item_type_id: Optional[UUID] = None
    item_type_name: str = ""
    item_group_id: Optional[UUID] = None
    item_group_name: str = ""
    base_uom_id: Optional[UUID] = None
    base_uom_name: str = ""
    barcode: str = ""
    status: str = ""
    is_batch_tracked: bool = False
    is_serial_tracked: bool = False
    abc_classification: str = ""
    is_active: bool = True
    created_at: Optional[datetime] = None


@dataclass
class ItemListDTO(BaseDTO):
    """DTO لیست کالاها — خلاصه."""
    id: UUID = None
    item_code: str = ""
    item_name: str = ""
    item_type_name: str = ""
    item_group_name: str = ""
    base_uom_name: str = ""
    status: str = ""
    is_active: bool = True


# ─────────────────────────────────────────────
# Warehouse DTOs
# ─────────────────────────────────────────────

@dataclass
class CreateWarehouseDTO(BaseDTO):
    """DTO ایجاد انبار."""
    warehouse_code: str = ""
    warehouse_name: str = ""
    warehouse_type: str = "MAIN"
    company_id: Optional[UUID] = None
    manager_user_id: Optional[UUID] = None
    address: str = ""
    city: str = ""
    province: str = ""
    phone: str = ""
    is_negative_stock_allowed: bool = False


@dataclass
class WarehouseResponseDTO(BaseDTO):
    """DTO پاسخ انبار."""
    id: UUID = None
    warehouse_code: str = ""
    warehouse_name: str = ""
    warehouse_type: str = ""
    company_id: Optional[UUID] = None
    is_active: bool = True
    created_at: Optional[datetime] = None


# ─────────────────────────────────────────────
# Stock Movement DTOs
# ─────────────────────────────────────────────

@dataclass
class GoodsReceiptDTO(BaseDTO):
    """DTO رسید کالا."""
    item_id: UUID = None
    warehouse_id: UUID = None
    location_id: Optional[UUID] = None
    quantity: str = "0"
    uom_id: UUID = None
    posting_date: date = None
    unit_cost: str = "0"
    batch_id: Optional[UUID] = None
    batch_number: str = ""
    serial_numbers: List[str] = field(default_factory=list)
    source_document_type: str = ""
    source_document_id: Optional[UUID] = None
    remarks: str = ""


@dataclass
class GoodsIssueDTO(BaseDTO):
    """DTO حواله کالا."""
    item_id: UUID = None
    warehouse_id: UUID = None
    location_id: Optional[UUID] = None
    quantity: str = "0"
    uom_id: UUID = None
    posting_date: date = None
    batch_id: Optional[UUID] = None
    serial_numbers: List[str] = field(default_factory=list)
    source_document_type: str = ""
    source_document_id: Optional[UUID] = None
    reason_code: str = ""
    remarks: str = ""


@dataclass
class StockTransferDTO(BaseDTO):
    """DTO انتقال موجودی."""
    item_id: UUID = None
    from_warehouse_id: UUID = None
    to_warehouse_id: UUID = None
    from_location_id: Optional[UUID] = None
    to_location_id: Optional[UUID] = None
    quantity: str = "0"
    uom_id: UUID = None
    posting_date: date = None
    batch_id: Optional[UUID] = None
    serial_numbers: List[str] = field(default_factory=list)
    remarks: str = ""


@dataclass
class StockAdjustmentDTO(BaseDTO):
    """DTO تعدیل موجودی."""
    item_id: UUID = None
    warehouse_id: UUID = None
    location_id: Optional[UUID] = None
    adjustment_quantity: str = "0"
    uom_id: UUID = None
    posting_date: date = None
    reason_code: str = ""
    batch_id: Optional[UUID] = None
    remarks: str = ""


@dataclass
class StockLedgerResponseDTO(BaseDTO):
    """DTO پاسخ ثبت دفتر."""
    id: UUID = None
    entry_number: str = ""
    posting_date: date = None
    item_code: str = ""
    item_name: str = ""
    warehouse_code: str = ""
    transaction_type: str = ""
    quantity: str = "0"
    uom_name: str = ""
    unit_cost: str = "0"
    total_cost: str = "0"
    batch_number: str = ""
    serial_no: str = ""
    source_document_type: str = ""
    remarks: str = ""
    created_at: Optional[datetime] = None


@dataclass
class StockBalanceResponseDTO(BaseDTO):
    """DTO پاسخ موجودی."""
    item_id: UUID = None
    item_code: str = ""
    item_name: str = ""
    warehouse_id: UUID = None
    warehouse_code: str = ""
    warehouse_name: str = ""
    quantity_on_hand: str = "0"
    quantity_reserved: str = "0"
    quantity_available: str = "0"
    quantity_in_transit: str = "0"
    uom_name: str = ""
    average_unit_cost: str = "0"
    total_value: str = "0"
    last_movement_date: Optional[date] = None


# ─────────────────────────────────────────────
# Batch DTOs
# ─────────────────────────────────────────────

@dataclass
class CreateBatchDTO(BaseDTO):
    """DTO ایجاد بچ."""
    item_id: UUID = None
    batch_number: str = ""
    manufacturing_date: Optional[date] = None
    expiry_date: Optional[date] = None
    vendor_batch_number: str = ""
    vendor_id: Optional[UUID] = None
    attributes: dict = field(default_factory=dict)


@dataclass
class BatchResponseDTO(BaseDTO):
    """DTO پاسخ بچ."""
    id: UUID = None
    batch_number: str = ""
    item_code: str = ""
    item_name: str = ""
    manufacturing_date: Optional[date] = None
    expiry_date: Optional[date] = None
    batch_status: str = ""
    quality_status: str = ""
    is_active: bool = True


# ─────────────────────────────────────────────
# Serial Number DTOs
# ─────────────────────────────────────────────

@dataclass
class CreateSerialDTO(BaseDTO):
    """DTO ایجاد سریال."""
    item_id: UUID = None
    serial_no: str = ""
    batch_id: Optional[UUID] = None
    manufacturing_date: Optional[date] = None
    warranty_months: int = 0


@dataclass
class SerialResponseDTO(BaseDTO):
    """DTO پاسخ سریال."""
    id: UUID = None
    serial_no: str = ""
    item_code: str = ""
    item_name: str = ""
    serial_status: str = ""
    quality_status: str = ""
    current_warehouse: str = ""
    batch_number: str = ""
    warranty_end_date: Optional[date] = None


# ─────────────────────────────────────────────
# Reservation DTOs
# ─────────────────────────────────────────────

@dataclass
class CreateReservationDTO(BaseDTO):
    """DTO ایجاد رزرو."""
    item_id: UUID = None
    warehouse_id: UUID = None
    quantity: str = "0"
    uom_id: UUID = None
    source_document_type: str = ""
    source_document_id: Optional[UUID] = None
    expiry_date: Optional[date] = None
    priority_level: int = 5
    required_by_date: Optional[date] = None
    remarks: str = ""


@dataclass
class ReservationResponseDTO(BaseDTO):
    """DTO پاسخ رزرو."""
    id: UUID = None
    reservation_number: str = ""
    item_code: str = ""
    warehouse_code: str = ""
    reserved_quantity: str = "0"
    allocated_quantity: str = "0"
    reservation_status: str = ""
    expiry_date: Optional[date] = None


# ─────────────────────────────────────────────
# Physical Inventory DTOs
# ─────────────────────────────────────────────

@dataclass
class CreatePhysicalInventoryDTO(BaseDTO):
    """DTO ایجاد شمارش فیزیکی."""
    inventory_type: str = "FULL"
    warehouse_id: Optional[UUID] = None
    location_id: Optional[UUID] = None
    item_group_id: Optional[UUID] = None
    is_blind_count: bool = False
    variance_threshold_percent: str = "5"
    scheduled_start_date: Optional[date] = None
    remarks: str = ""


@dataclass
class RecordCountDTO(BaseDTO):
    """DTO ثبت شمارش."""
    line_id: UUID = None
    count_quantity: str = "0"
    count_number: int = 1  # 1, 2, or 3


@dataclass
class PhysicalInventoryResponseDTO(BaseDTO):
    """DTO پاسخ شمارش فیزیکی."""
    id: UUID = None
    inventory_number: str = ""
    inventory_type: str = ""
    inventory_status: str = ""
    warehouse_name: str = ""
    total_lines: int = 0
    counted_lines: int = 0
    total_variance_value: str = "0"
    created_at: Optional[datetime] = None


# ─────────────────────────────────────────────
# Inspection DTOs
# ─────────────────────────────────────────────

@dataclass
class CreateInspectionDTO(BaseDTO):
    """DTO ایجاد بازرسی."""
    item_id: UUID = None
    inspection_type: str = "INCOMING"
    inspection_quantity: str = "0"
    uom_id: UUID = None
    batch_id: Optional[UUID] = None
    warehouse_id: Optional[UUID] = None
    source_document_type: str = ""
    source_document_id: Optional[UUID] = None


@dataclass
class RecordInspectionResultDTO(BaseDTO):
    """DTO ثبت نتیجه بازرسی."""
    inspection_lot_id: UUID = None
    characteristic: str = ""
    target_value: str = ""
    actual_value: str = ""
    tolerance_lower: Optional[str] = None
    tolerance_upper: Optional[str] = None


@dataclass
class InspectionDecisionDTO(BaseDTO):
    """DTO تصمیم بازرسی."""
    inspection_lot_id: UUID = None
    quality_decision: str = ""  # ACCEPTED/REJECTED/CONDITIONAL
    remarks: str = ""


@dataclass
class InspectionResponseDTO(BaseDTO):
    """DTO پاسخ بازرسی."""
    id: UUID = None
    inspection_lot_number: str = ""
    inspection_type: str = ""
    item_code: str = ""
    item_name: str = ""
    inspection_quantity: str = "0"
    inspection_status: str = ""
    quality_decision: str = ""
    results_count: int = 0
    created_at: Optional[datetime] = None
