"""
SCM Public Events — Contract v1.

رویدادهای عمومی ماژول خرید که سایر ماژول‌ها می‌توانند subscribe کنند.
"""
from dataclasses import dataclass
from datetime import datetime
from decimal import Decimal
from typing import Optional
from uuid import UUID


@dataclass(frozen=True)
class SCMEvent:
    """رویداد پایه ماژول خرید."""
    event_id: UUID
    tenant_id: UUID
    occurred_at: datetime
    version: int = 1


# ─── Vendor Events ────────────────────────────────

@dataclass(frozen=True)
class VendorCreated(SCMEvent):
    event_type: str = "scm.vendor.created"
    vendor_id: Optional[UUID] = None
    vendor_code: str = ""
    vendor_name: str = ""


@dataclass(frozen=True)
class VendorUpdated(SCMEvent):
    event_type: str = "scm.vendor.updated"
    vendor_id: Optional[UUID] = None
    vendor_code: str = ""


@dataclass(frozen=True)
class VendorBlocked(SCMEvent):
    event_type: str = "scm.vendor.blocked"
    vendor_id: Optional[UUID] = None
    vendor_code: str = ""


@dataclass(frozen=True)
class VendorActivated(SCMEvent):
    event_type: str = "scm.vendor.activated"
    vendor_id: Optional[UUID] = None
    vendor_code: str = ""


# ─── PR Events ────────────────────────────────────

@dataclass(frozen=True)
class PRCreated(SCMEvent):
    event_type: str = "scm.pr.created"
    pr_id: Optional[UUID] = None
    pr_number: str = ""
    total_amount: Decimal = Decimal("0")


@dataclass(frozen=True)
class PRApproved(SCMEvent):
    event_type: str = "scm.pr.approved"
    pr_id: Optional[UUID] = None
    pr_number: str = ""


@dataclass(frozen=True)
class PRRejected(SCMEvent):
    event_type: str = "scm.pr.rejected"
    pr_id: Optional[UUID] = None
    pr_number: str = ""


@dataclass(frozen=True)
class PRConverted(SCMEvent):
    event_type: str = "scm.pr.converted"
    pr_id: Optional[UUID] = None
    pr_number: str = ""
    po_id: Optional[UUID] = None
    po_number: str = ""


# ─── RFQ Events ───────────────────────────────────

@dataclass(frozen=True)
class RFQCreated(SCMEvent):
    event_type: str = "scm.rfq.created"
    rfq_id: Optional[UUID] = None
    rfq_number: str = ""


@dataclass(frozen=True)
class RFQSent(SCMEvent):
    event_type: str = "scm.rfq.sent"
    rfq_id: Optional[UUID] = None
    rfq_number: str = ""


@dataclass(frozen=True)
class RFQAwarded(SCMEvent):
    event_type: str = "scm.rfq.awarded"
    rfq_id: Optional[UUID] = None
    rfq_number: str = ""
    awarded_vendor_id: Optional[UUID] = None


@dataclass(frozen=True)
class RFQClosed(SCMEvent):
    event_type: str = "scm.rfq.closed"
    rfq_id: Optional[UUID] = None
    rfq_number: str = ""


# ─── PO Events ────────────────────────────────────

@dataclass(frozen=True)
class POCreated(SCMEvent):
    event_type: str = "scm.po.created"
    po_id: Optional[UUID] = None
    po_number: str = ""
    vendor_id: Optional[UUID] = None
    total_amount: Decimal = Decimal("0")


@dataclass(frozen=True)
class POApproved(SCMEvent):
    event_type: str = "scm.po.approved"
    po_id: Optional[UUID] = None
    po_number: str = ""


@dataclass(frozen=True)
class POSent(SCMEvent):
    event_type: str = "scm.po.sent"
    po_id: Optional[UUID] = None
    po_number: str = ""
    vendor_id: Optional[UUID] = None


@dataclass(frozen=True)
class POPartiallyReceived(SCMEvent):
    event_type: str = "scm.po.partially_received"
    po_id: Optional[UUID] = None
    po_number: str = ""


@dataclass(frozen=True)
class POFullyReceived(SCMEvent):
    event_type: str = "scm.po.fully_received"
    po_id: Optional[UUID] = None
    po_number: str = ""


@dataclass(frozen=True)
class POCancelled(SCMEvent):
    event_type: str = "scm.po.cancelled"
    po_id: Optional[UUID] = None
    po_number: str = ""


@dataclass(frozen=True)
class POClosed(SCMEvent):
    event_type: str = "scm.po.closed"
    po_id: Optional[UUID] = None
    po_number: str = ""


# ─── Goods Receipt Events ────────────────────────

@dataclass(frozen=True)
class GoodsReceiptConfirmed(SCMEvent):
    event_type: str = "scm.goods_receipt.confirmed"
    gr_id: Optional[UUID] = None
    gr_number: str = ""
    po_id: Optional[UUID] = None
    vendor_id: Optional[UUID] = None
    total_amount: Decimal = Decimal("0")


@dataclass(frozen=True)
class GoodsReceiptCancelled(SCMEvent):
    event_type: str = "scm.goods_receipt.cancelled"
    gr_id: Optional[UUID] = None
    gr_number: str = ""


# ─── Return Events ───────────────────────────────

@dataclass(frozen=True)
class PurchaseReturnCompleted(SCMEvent):
    event_type: str = "scm.purchase_return.completed"
    return_id: Optional[UUID] = None
    return_number: str = ""
    vendor_id: Optional[UUID] = None
    total_amount: Decimal = Decimal("0")


# ─── Evaluation Events ───────────────────────────

@dataclass(frozen=True)
class VendorEvaluationCompleted(SCMEvent):
    event_type: str = "scm.vendor_evaluation.completed"
    evaluation_id: Optional[UUID] = None
    vendor_id: Optional[UUID] = None
    total_score: Decimal = Decimal("0")
    rating: str = ""
