"""
Inventory Public Commands — Contract v1.

دستورات عمومی ماژول انبار که سایر ماژول‌ها می‌توانند فراخوانی کنند.
"""
from dataclasses import dataclass, field
from datetime import date
from decimal import Decimal
from typing import Optional, List
from uuid import UUID


# ═══════════════════════════════════════════════════
# Stock Commands
# ═══════════════════════════════════════════════════

@dataclass
class PostGoodsReceipt:
    """ثبت رسید کالا."""
    tenant_id: UUID
    item_id: UUID
    warehouse_id: UUID
    quantity: Decimal
    uom_id: UUID
    posting_date: date
    unit_cost: Decimal = Decimal("0")
    batch_id: Optional[UUID] = None
    serial_numbers: List[str] = field(default_factory=list)
    location_id: Optional[UUID] = None
    source_document_type: str = ""
    source_document_id: Optional[UUID] = None
    remarks: str = ""


@dataclass
class PostGoodsIssue:
    """ثبت حواله کالا."""
    tenant_id: UUID
    item_id: UUID
    warehouse_id: UUID
    quantity: Decimal
    uom_id: UUID
    posting_date: date
    batch_id: Optional[UUID] = None
    serial_numbers: List[str] = field(default_factory=list)
    location_id: Optional[UUID] = None
    source_document_type: str = ""
    source_document_id: Optional[UUID] = None
    reason_code: str = ""
    remarks: str = ""


@dataclass
class TransferStock:
    """انتقال موجودی بین انبارها."""
    tenant_id: UUID
    item_id: UUID
    from_warehouse_id: UUID
    to_warehouse_id: UUID
    quantity: Decimal
    uom_id: UUID
    posting_date: date
    batch_id: Optional[UUID] = None
    serial_numbers: List[str] = field(default_factory=list)
    remarks: str = ""


@dataclass
class AdjustStock:
    """تعدیل موجودی."""
    tenant_id: UUID
    item_id: UUID
    warehouse_id: UUID
    adjustment_quantity: Decimal
    uom_id: UUID
    posting_date: date
    reason_code: str = ""
    batch_id: Optional[UUID] = None
    location_id: Optional[UUID] = None
    remarks: str = ""


# ═══════════════════════════════════════════════════
# Reservation Commands
# ═══════════════════════════════════════════════════

@dataclass
class ReserveStock:
    """رزرو موجودی."""
    tenant_id: UUID
    item_id: UUID
    warehouse_id: UUID
    quantity: Decimal
    uom_id: UUID
    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


@dataclass
class CancelReservation:
    """لغو رزرو."""
    tenant_id: UUID
    reservation_id: UUID
    reason: str = ""


# ═══════════════════════════════════════════════════
# Batch Commands
# ═══════════════════════════════════════════════════

@dataclass
class CreateBatch:
    """ایجاد بچ جدید."""
    tenant_id: UUID
    item_id: UUID
    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 BlockBatch:
    """مسدود کردن بچ."""
    tenant_id: UUID
    batch_id: UUID
    reason: str = ""


# ═══════════════════════════════════════════════════
# Quality Commands
# ═══════════════════════════════════════════════════

@dataclass
class CreateInspectionLot:
    """ایجاد لات بازرسی."""
    tenant_id: UUID
    item_id: UUID
    inspection_type: str  # INCOMING / IN_PROCESS / OUTGOING
    inspection_quantity: Decimal
    uom_id: UUID
    batch_id: Optional[UUID] = None
    warehouse_id: Optional[UUID] = None
    source_document_type: str = ""
    source_document_id: Optional[UUID] = None


@dataclass
class RecordInspectionDecision:
    """ثبت تصمیم بازرسی."""
    tenant_id: UUID
    inspection_lot_id: UUID
    quality_decision: str  # ACCEPTED / REJECTED / CONDITIONAL / REWORK
    remarks: str = ""
