"""
Inventory Public Types — Contract v1.

تایپ‌های عمومی ماژول انبار برای استفاده توسط سایر ماژول‌ها.
"""
from dataclasses import dataclass
from datetime import date
from decimal import Decimal
from typing import Optional, List
from uuid import UUID


# ═══════════════════════════════════════════════════
# Summary DTOs (for cross-module consumption)
# ═══════════════════════════════════════════════════

@dataclass(frozen=True)
class ItemSummary:
    """خلاصه اطلاعات کالا."""
    id: UUID
    item_code: str
    item_name: str
    item_type: str
    item_group: str = ""
    status: str = ""
    base_uom: str = ""


@dataclass(frozen=True)
class WarehouseSummary:
    """خلاصه اطلاعات انبار."""
    id: UUID
    warehouse_code: str
    warehouse_name: str
    warehouse_type: str = ""
    is_active: bool = True


@dataclass(frozen=True)
class StockBalanceSummary:
    """خلاصه موجودی."""
    item_id: UUID
    item_code: str
    warehouse_id: UUID
    warehouse_code: str
    quantity_on_hand: Decimal = Decimal("0")
    quantity_reserved: Decimal = Decimal("0")
    quantity_available: Decimal = Decimal("0")
    uom: str = ""


@dataclass(frozen=True)
class BatchSummary:
    """خلاصه اطلاعات بچ."""
    id: UUID
    batch_number: str
    item_id: UUID
    item_code: str
    expiry_date: Optional[date] = None
    batch_status: str = "ACTIVE"
    quality_status: str = "PENDING"


@dataclass(frozen=True)
class SerialSummary:
    """خلاصه سریال."""
    id: UUID
    serial_no: str
    item_id: UUID
    item_code: str
    serial_status: str = "IN_STOCK"
    current_warehouse_id: Optional[UUID] = None


@dataclass(frozen=True)
class ATPResult:
    """نتیجه ATP."""
    item_id: UUID
    warehouse_id: Optional[UUID]
    quantity_on_hand: Decimal = Decimal("0")
    quantity_reserved: Decimal = Decimal("0")
    quantity_allocated: Decimal = Decimal("0")
    quantity_in_transit: Decimal = Decimal("0")
    available_to_promise: Decimal = Decimal("0")


# ═══════════════════════════════════════════════════
# Enums (publicly available)
# ═══════════════════════════════════════════════════

class ItemStatus:
    ACTIVE = "ACTIVE"
    INACTIVE = "INACTIVE"
    OBSOLETE = "OBSOLETE"
    BLOCKED = "BLOCKED"


class TransactionType:
    GOODS_RECEIPT = "GR"
    GOODS_ISSUE = "GI"
    TRANSFER = "TRANSFER"
    ADJUSTMENT = "ADJUSTMENT"
    RETURN = "RETURN"
    SCRAP = "SCRAP"


class BatchStatus:
    ACTIVE = "ACTIVE"
    EXPIRED = "EXPIRED"
    BLOCKED = "BLOCKED"
    QUARANTINE = "QUARANTINE"


class SerialStatus:
    IN_STOCK = "IN_STOCK"
    SOLD = "SOLD"
    RETURNED = "RETURNED"
    SCRAPPED = "SCRAPPED"
    IN_REPAIR = "IN_REPAIR"
    IN_TRANSIT = "IN_TRANSIT"


class QualityDecision:
    ACCEPTED = "ACCEPTED"
    REJECTED = "REJECTED"
    CONDITIONAL = "CONDITIONAL"
    REWORK = "REWORK"
