"""
SCM Public Types — Contract v1.

تایپ‌های عمومی ماژول خرید برای استفاده توسط سایر ماژول‌ها.
"""
from dataclasses import dataclass
from datetime import date
from decimal import Decimal
from typing import Optional
from uuid import UUID


# ═══════════════════════════════════════════════════
# Summary DTOs (for cross-module consumption)
# ═══════════════════════════════════════════════════

@dataclass(frozen=True)
class VendorSummary:
    """خلاصه اطلاعات تأمین‌کننده."""
    id: UUID
    vendor_code: str
    vendor_name: str
    vendor_type: str = ""
    category_name: str = ""
    status: str = ""
    phone: str = ""
    email: str = ""


@dataclass(frozen=True)
class PurchaseOrderSummary:
    """خلاصه سفارش خرید."""
    id: UUID
    po_number: str
    vendor_id: UUID
    vendor_name: str = ""
    status: str = ""
    total_amount: Decimal = Decimal("0")
    currency_code: str = "IRR"
    order_date: Optional[date] = None


@dataclass(frozen=True)
class PurchaseRequisitionSummary:
    """خلاصه درخواست خرید."""
    id: UUID
    pr_number: str
    requester_name: str = ""
    status: str = ""
    total_estimated_amount: Decimal = Decimal("0")
    request_date: Optional[date] = None


@dataclass(frozen=True)
class GoodsReceiptSummary:
    """خلاصه رسید کالا."""
    id: UUID
    gr_number: str
    po_number: str = ""
    vendor_name: str = ""
    status: str = ""
    total_amount: Decimal = Decimal("0")
    receipt_date: Optional[date] = None


# ═══════════════════════════════════════════════════
# Enums (publicly available)
# ═══════════════════════════════════════════════════

class VendorStatus:
    ACTIVE = "ACTIVE"
    INACTIVE = "INACTIVE"
    BLOCKED = "BLOCKED"
    PENDING_APPROVAL = "PENDING_APPROVAL"


class POStatus:
    DRAFT = "DRAFT"
    PENDING_APPROVAL = "PENDING_APPROVAL"
    APPROVED = "APPROVED"
    REJECTED = "REJECTED"
    SENT = "SENT"
    PARTIALLY_RECEIVED = "PARTIALLY_RECEIVED"
    FULLY_RECEIVED = "FULLY_RECEIVED"
    CANCELLED = "CANCELLED"
    CLOSED = "CLOSED"


class PRStatus:
    DRAFT = "DRAFT"
    PENDING_APPROVAL = "PENDING_APPROVAL"
    APPROVED = "APPROVED"
    REJECTED = "REJECTED"
    CONVERTED = "CONVERTED"
    CANCELLED = "CANCELLED"


class GRStatus:
    DRAFT = "DRAFT"
    CONFIRMED = "CONFIRMED"
    CANCELLED = "CANCELLED"
