"""
SCM 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


# ═══════════════════════════════════════════════════
# Vendor DTOs
# ═══════════════════════════════════════════════════

@dataclass
class CreateVendorDTO(BaseDTO):
    """DTO ایجاد تأمین‌کننده."""
    vendor_code: str = ""
    vendor_name: str = ""
    vendor_name_en: str = ""
    vendor_type: str = "COMPANY"
    category_id: Optional[UUID] = None
    national_id: str = ""
    economic_code: str = ""
    registration_number: str = ""
    phone: str = ""
    fax: str = ""
    email: str = ""
    website: str = ""
    representative_employee_id: Optional[UUID] = None
    payment_terms_days: int = 30
    credit_limit: int = 0
    currency_code: str = "IRR"
    notes: str = ""


@dataclass
class UpdateVendorDTO(BaseDTO):
    """DTO بروزرسانی تأمین‌کننده."""
    vendor_name: Optional[str] = None
    vendor_name_en: Optional[str] = None
    vendor_type: Optional[str] = None
    category_id: Optional[UUID] = None
    phone: Optional[str] = None
    fax: Optional[str] = None
    email: Optional[str] = None
    website: Optional[str] = None
    representative_employee_id: Optional[UUID] = None
    payment_terms_days: Optional[int] = None
    credit_limit: Optional[int] = None
    notes: Optional[str] = None


@dataclass
class VendorResponseDTO(BaseDTO):
    """DTO پاسخ تأمین‌کننده."""
    id: Optional[UUID] = None
    vendor_code: str = ""
    vendor_name: str = ""
    vendor_name_en: str = ""
    vendor_type: str = ""
    category_id: Optional[UUID] = None
    status: str = ""
    national_id: str = ""
    economic_code: str = ""
    phone: str = ""
    email: str = ""
    website: str = ""
    payment_terms_days: int = 30
    credit_limit: int = 0
    is_active: bool = True
    created_at: Optional[datetime] = None


@dataclass
class VendorListDTO(BaseDTO):
    """DTO لیست تأمین‌کنندگان — خلاصه."""
    id: Optional[UUID] = None
    vendor_code: str = ""
    vendor_name: str = ""
    vendor_type: str = ""
    status: str = ""
    phone: str = ""
    is_active: bool = True


@dataclass
class CreateVendorCategoryDTO(BaseDTO):
    """DTO ایجاد دسته‌بندی تأمین‌کنندگان."""
    category_code: str = ""
    category_name: str = ""
    parent_category_id: Optional[UUID] = None
    description: str = ""


@dataclass
class VendorCategoryResponseDTO(BaseDTO):
    """DTO پاسخ دسته‌بندی."""
    id: Optional[UUID] = None
    category_code: str = ""
    category_name: str = ""
    parent_category_id: Optional[UUID] = None
    level: int = 0
    is_active: bool = True


# ═══════════════════════════════════════════════════
# Purchase Requisition DTOs
# ═══════════════════════════════════════════════════

@dataclass
class CreatePRLineDTO(BaseDTO):
    """DTO ایجاد آیتم درخواست خرید."""
    item_id: Optional[UUID] = None
    item_code: str = ""
    item_name: str = ""
    description: str = ""
    quantity: str = "0"
    uom_id: Optional[UUID] = None
    uom_code: str = ""
    estimated_unit_price: str = "0"
    required_date: Optional[date] = None
    warehouse_id: Optional[UUID] = None
    warehouse_name: str = ""
    preferred_vendor_id: Optional[UUID] = None
    notes: str = ""


@dataclass
class CreatePRDTO(BaseDTO):
    """DTO ایجاد درخواست خرید."""
    pr_number: str = ""
    title: str = ""
    description: str = ""
    priority: str = "NORMAL"
    requester_id: Optional[UUID] = None
    requester_name: str = ""
    department: str = ""
    required_date: Optional[date] = None
    currency_code: str = "IRR"
    notes: str = ""
    lines: List[CreatePRLineDTO] = field(default_factory=list)


@dataclass
class PRResponseDTO(BaseDTO):
    """DTO پاسخ درخواست خرید."""
    id: Optional[UUID] = None
    pr_number: str = ""
    title: str = ""
    status: str = ""
    priority: str = ""
    requester_name: str = ""
    department: str = ""
    request_date: Optional[date] = None
    required_date: Optional[date] = None
    total_estimated_amount: str = "0"
    currency_code: str = "IRR"
    created_at: Optional[datetime] = None


@dataclass
class PRListDTO(BaseDTO):
    """DTO لیست درخواست خرید — خلاصه."""
    id: Optional[UUID] = None
    pr_number: str = ""
    title: str = ""
    status: str = ""
    priority: str = ""
    requester_name: str = ""
    total_estimated_amount: str = "0"
    required_date: Optional[date] = None


# ═══════════════════════════════════════════════════
# RFQ DTOs
# ═══════════════════════════════════════════════════

@dataclass
class CreateRFQLineDTO(BaseDTO):
    """DTO ایجاد آیتم استعلام."""
    item_id: Optional[UUID] = None
    item_code: str = ""
    item_name: str = ""
    description: str = ""
    quantity: str = "0"
    uom_id: Optional[UUID] = None
    uom_code: str = ""
    required_date: Optional[date] = None
    notes: str = ""


@dataclass
class CreateRFQDTO(BaseDTO):
    """DTO ایجاد استعلام."""
    rfq_number: str = ""
    title: str = ""
    description: str = ""
    pr_id: Optional[UUID] = None
    closing_date: Optional[date] = None
    required_date: Optional[date] = None
    buyer_id: Optional[UUID] = None
    buyer_name: str = ""
    currency_code: str = "IRR"
    notes: str = ""
    lines: List[CreateRFQLineDTO] = field(default_factory=list)
    invited_vendor_ids: List[UUID] = field(default_factory=list)


@dataclass
class RFQResponseDTO(BaseDTO):
    """DTO پاسخ استعلام."""
    id: Optional[UUID] = None
    rfq_number: str = ""
    title: str = ""
    status: str = ""
    pr_number: str = ""
    issue_date: Optional[date] = None
    closing_date: Optional[date] = None
    buyer_name: str = ""
    currency_code: str = "IRR"
    created_at: Optional[datetime] = None


@dataclass
class RFQListDTO(BaseDTO):
    """DTO لیست استعلام — خلاصه."""
    id: Optional[UUID] = None
    rfq_number: str = ""
    title: str = ""
    status: str = ""
    closing_date: Optional[date] = None


@dataclass
class SubmitVendorResponseDTO(BaseDTO):
    """DTO ثبت پاسخ تأمین‌کننده."""
    vendor_id: Optional[UUID] = None
    vendor_name: str = ""
    response_date: Optional[date] = None
    validity_date: Optional[date] = None
    payment_terms: str = ""
    delivery_terms: str = ""
    notes: str = ""
    lines: list = field(default_factory=list)
    # lines: [{"rfq_line_id": UUID, "unit_price": Decimal, "delivery_days": int}]


# ═══════════════════════════════════════════════════
# Purchase Order DTOs
# ═══════════════════════════════════════════════════

@dataclass
class CreatePOLineDTO(BaseDTO):
    """DTO ایجاد آیتم سفارش خرید."""
    item_id: Optional[UUID] = None
    item_code: str = ""
    item_name: str = ""
    description: str = ""
    quantity: str = "0"
    uom_id: Optional[UUID] = None
    uom_code: str = ""
    unit_price: str = "0"
    discount_percent: str = "0"
    tax_percent: str = "0"
    warehouse_id: Optional[UUID] = None
    warehouse_name: str = ""
    required_date: Optional[date] = None
    pr_line_id: Optional[UUID] = None
    rfq_response_line_id: Optional[UUID] = None
    notes: str = ""


@dataclass
class CreatePODTO(BaseDTO):
    """DTO ایجاد سفارش خرید."""
    po_number: str = ""
    title: str = ""
    description: str = ""
    priority: str = "NORMAL"
    vendor_id: Optional[UUID] = None
    vendor_name: str = ""
    vendor_code: str = ""
    pr_id: Optional[UUID] = None
    pr_number: str = ""
    rfq_id: Optional[UUID] = None
    rfq_number: str = ""
    contract_id: Optional[UUID] = None
    buyer_id: Optional[UUID] = None
    buyer_name: str = ""
    expected_delivery_date: Optional[date] = None
    currency_code: str = "IRR"
    payment_terms: str = ""
    delivery_terms: str = ""
    shipping_address: str = ""
    notes: str = ""
    lines: List[CreatePOLineDTO] = field(default_factory=list)


@dataclass
class POResponseDTO(BaseDTO):
    """DTO پاسخ سفارش خرید."""
    id: Optional[UUID] = None
    po_number: str = ""
    title: str = ""
    status: str = ""
    priority: str = ""
    vendor_name: str = ""
    vendor_code: str = ""
    order_date: Optional[date] = None
    expected_delivery_date: Optional[date] = None
    subtotal: str = "0"
    total_discount: str = "0"
    total_tax: str = "0"
    total_amount: str = "0"
    currency_code: str = "IRR"
    buyer_name: str = ""
    created_at: Optional[datetime] = None


@dataclass
class POListDTO(BaseDTO):
    """DTO لیست سفارش خرید — خلاصه."""
    id: Optional[UUID] = None
    po_number: str = ""
    title: str = ""
    status: str = ""
    priority: str = ""
    vendor_name: str = ""
    total_amount: str = "0"
    order_date: Optional[date] = None


# ═══════════════════════════════════════════════════
# Goods Receipt DTOs
# ═══════════════════════════════════════════════════

@dataclass
class CreateGRLineDTO(BaseDTO):
    """DTO ایجاد آیتم رسید کالا."""
    po_line_id: Optional[UUID] = None
    item_id: Optional[UUID] = None
    item_code: str = ""
    item_name: str = ""
    received_quantity: str = "0"
    accepted_quantity: str = "0"
    rejected_quantity: str = "0"
    uom_id: Optional[UUID] = None
    uom_code: str = ""
    unit_cost: str = "0"
    warehouse_id: Optional[UUID] = None
    warehouse_name: str = ""
    storage_location_id: Optional[UUID] = None
    batch_number: str = ""
    serial_numbers: List[str] = field(default_factory=list)
    inspection_required: bool = False
    notes: str = ""


@dataclass
class CreateGRDTO(BaseDTO):
    """DTO ایجاد رسید کالا."""
    gr_number: str = ""
    po_id: Optional[UUID] = None
    po_number: str = ""
    vendor_id: Optional[UUID] = None
    vendor_name: str = ""
    receiver_id: Optional[UUID] = None
    receiver_name: str = ""
    receipt_date: Optional[date] = None
    delivery_note_number: str = ""
    transporter: str = ""
    currency_code: str = "IRR"
    notes: str = ""
    lines: List[CreateGRLineDTO] = field(default_factory=list)


@dataclass
class GRResponseDTO(BaseDTO):
    """DTO پاسخ رسید کالا."""
    id: Optional[UUID] = None
    gr_number: str = ""
    status: str = ""
    po_number: str = ""
    vendor_name: str = ""
    receiver_name: str = ""
    receipt_date: Optional[date] = None
    total_amount: str = "0"
    created_at: Optional[datetime] = None


@dataclass
class GRListDTO(BaseDTO):
    """DTO لیست رسید کالا — خلاصه."""
    id: Optional[UUID] = None
    gr_number: str = ""
    status: str = ""
    po_number: str = ""
    vendor_name: str = ""
    receipt_date: Optional[date] = None
    total_amount: str = "0"


# ═══════════════════════════════════════════════════
# Purchase Return DTOs
# ═══════════════════════════════════════════════════

@dataclass
class CreateReturnLineDTO(BaseDTO):
    """DTO ایجاد آیتم برگشت."""
    gr_line_id: Optional[UUID] = None
    po_line_id: Optional[UUID] = None
    item_id: Optional[UUID] = None
    item_code: str = ""
    item_name: str = ""
    return_quantity: str = "0"
    uom_id: Optional[UUID] = None
    uom_code: str = ""
    unit_cost: str = "0"
    reason: str = "OTHER"
    reason_detail: str = ""
    warehouse_id: Optional[UUID] = None
    batch_number: str = ""
    notes: str = ""


@dataclass
class CreateReturnDTO(BaseDTO):
    """DTO ایجاد برگشت از خرید."""
    return_number: str = ""
    po_id: Optional[UUID] = None
    po_number: str = ""
    gr_id: Optional[UUID] = None
    gr_number: str = ""
    vendor_id: Optional[UUID] = None
    vendor_name: str = ""
    requester_id: Optional[UUID] = None
    requester_name: str = ""
    return_date: Optional[date] = None
    currency_code: str = "IRR"
    notes: str = ""
    lines: List[CreateReturnLineDTO] = field(default_factory=list)


@dataclass
class ReturnResponseDTO(BaseDTO):
    """DTO پاسخ برگشت از خرید."""
    id: Optional[UUID] = None
    return_number: str = ""
    status: str = ""
    po_number: str = ""
    vendor_name: str = ""
    return_date: Optional[date] = None
    total_amount: str = "0"
    created_at: Optional[datetime] = None


@dataclass
class ReturnListDTO(BaseDTO):
    """DTO لیست برگشت از خرید — خلاصه."""
    id: Optional[UUID] = None
    return_number: str = ""
    status: str = ""
    vendor_name: str = ""
    total_amount: str = "0"
    return_date: Optional[date] = None


# ═══════════════════════════════════════════════════
# Vendor Evaluation DTOs
# ═══════════════════════════════════════════════════

@dataclass
class CreateEvaluationScoreDTO(BaseDTO):
    """DTO ایجاد امتیاز ارزیابی."""
    criteria_id: Optional[UUID] = None
    score: str = "0"
    comments: str = ""


@dataclass
class CreateEvaluationDTO(BaseDTO):
    """DTO ایجاد ارزیابی تأمین‌کننده."""
    vendor_id: Optional[UUID] = None
    vendor_name: str = ""
    period_id: Optional[UUID] = None
    evaluator_id: Optional[UUID] = None
    evaluator_name: str = ""
    evaluation_date: Optional[date] = None
    comments: str = ""
    scores: List[CreateEvaluationScoreDTO] = field(default_factory=list)


@dataclass
class EvaluationResponseDTO(BaseDTO):
    """DTO پاسخ ارزیابی."""
    id: Optional[UUID] = None
    vendor_name: str = ""
    period_name: str = ""
    evaluator_name: str = ""
    status: str = ""
    evaluation_date: Optional[date] = None
    total_score: str = "0"
    rating: str = ""
    created_at: Optional[datetime] = None


@dataclass
class EvaluationListDTO(BaseDTO):
    """DTO لیست ارزیابی — خلاصه."""
    id: Optional[UUID] = None
    vendor_name: str = ""
    period_name: str = ""
    status: str = ""
    total_score: str = "0"
    rating: str = ""


@dataclass
class CreateEvaluationCriteriaDTO(BaseDTO):
    """DTO ایجاد معیار ارزیابی."""
    criteria_code: str = ""
    criteria_name: str = ""
    description: str = ""
    weight: str = "0"
    max_score: str = "100"


@dataclass
class EvaluationCriteriaResponseDTO(BaseDTO):
    """DTO پاسخ معیار ارزیابی."""
    id: Optional[UUID] = None
    criteria_code: str = ""
    criteria_name: str = ""
    weight: str = "0"
    max_score: str = "100"
    is_active: bool = True


@dataclass
class CreateEvaluationPeriodDTO(BaseDTO):
    """DTO ایجاد دوره ارزیابی."""
    period_name: str = ""
    start_date: Optional[date] = None
    end_date: Optional[date] = None


@dataclass
class EvaluationPeriodResponseDTO(BaseDTO):
    """DTO پاسخ دوره ارزیابی."""
    id: Optional[UUID] = None
    period_name: str = ""
    start_date: Optional[date] = None
    end_date: Optional[date] = None
    is_active: bool = True


# ═══════════════════════════════════════════════════
# Price Management DTOs
# ═══════════════════════════════════════════════════

@dataclass
class CreatePriceListItemDTO(BaseDTO):
    """DTO ایجاد آیتم لیست قیمت."""
    item_id: Optional[UUID] = None
    item_code: str = ""
    item_name: str = ""
    uom_id: Optional[UUID] = None
    uom_code: str = ""
    unit_price: str = "0"
    min_quantity: str = "1"
    lead_time_days: int = 0
    notes: str = ""


@dataclass
class CreatePriceListDTO(BaseDTO):
    """DTO ایجاد لیست قیمت."""
    vendor_id: Optional[UUID] = None
    vendor_name: str = ""
    price_list_name: str = ""
    description: str = ""
    currency_code: str = "IRR"
    valid_from: Optional[date] = None
    valid_to: Optional[date] = None
    items: List[CreatePriceListItemDTO] = field(default_factory=list)


@dataclass
class PriceListResponseDTO(BaseDTO):
    """DTO پاسخ لیست قیمت."""
    id: Optional[UUID] = None
    vendor_name: str = ""
    price_list_name: str = ""
    currency_code: str = "IRR"
    valid_from: Optional[date] = None
    valid_to: Optional[date] = None
    is_active: bool = True
    created_at: Optional[datetime] = None


@dataclass
class PriceListListDTO(BaseDTO):
    """DTO لیست قیمت — خلاصه."""
    id: Optional[UUID] = None
    vendor_name: str = ""
    price_list_name: str = ""
    valid_from: Optional[date] = None
    valid_to: Optional[date] = None
    is_active: bool = True


@dataclass
class CreateDiscountDTO(BaseDTO):
    """DTO ایجاد تخفیف."""
    vendor_id: Optional[UUID] = None
    item_id: Optional[UUID] = None
    item_group_id: Optional[UUID] = None
    discount_type: str = "PERCENTAGE"
    discount_value: str = "0"
    min_quantity: str = "0"
    min_amount: str = "0"
    valid_from: Optional[date] = None
    valid_to: Optional[date] = None
    description: str = ""


@dataclass
class DiscountResponseDTO(BaseDTO):
    """DTO پاسخ تخفیف."""
    id: Optional[UUID] = None
    vendor_id: Optional[UUID] = None
    discount_type: str = ""
    discount_value: str = "0"
    valid_from: Optional[date] = None
    valid_to: Optional[date] = None
    is_active: bool = True
