"""
CLM Domain Events.

رویدادهای داخلی دامنه — برای استفاده درون ماژول.
رویدادهای عمومی (cross-module) در contracts/v1/events.py هستند.
"""
from dataclasses import dataclass, field
from datetime import date, datetime
from decimal import Decimal
from typing import Optional, List
from uuid import UUID, uuid4


@dataclass
class ContractDomainEvent:
    """رویداد پایه دامنه CLM."""
    event_id: UUID = field(default_factory=uuid4)
    tenant_id: Optional[UUID] = None
    occurred_at: datetime = field(default_factory=datetime.utcnow)
    contract_id: Optional[UUID] = None
    user_id: Optional[UUID] = None


@dataclass
class ContractStatusChanged(ContractDomainEvent):
    """وضعیت قرارداد تغییر کرد."""
    old_status: str = ""
    new_status: str = ""
    reason: str = ""


@dataclass
class ContractValueChanged(ContractDomainEvent):
    """مبلغ قرارداد تغییر کرد."""
    old_value: Optional[Decimal] = None
    new_value: Optional[Decimal] = None
    amendment_id: Optional[UUID] = None


@dataclass
class MilestoneStatusChanged(ContractDomainEvent):
    """وضعیت مرحله تغییر کرد."""
    milestone_id: Optional[UUID] = None
    old_status: str = ""
    new_status: str = ""


@dataclass
class ContractExpiryWarning(ContractDomainEvent):
    """هشدار انقضای قرارداد."""
    days_to_expiry: int = 0
    expiry_date: Optional[date] = None


@dataclass
class GuaranteeExpiryWarning(ContractDomainEvent):
    """هشدار انقضای ضمانتنامه."""
    guarantee_type: str = ""
    days_to_expiry: int = 0
    expiry_date: Optional[date] = None
