"""
ContractAmendment — Domain Entity.

الحاقیه/اصلاحیه قرارداد.
"""
from dataclasses import dataclass, field
from datetime import date
from decimal import Decimal
from typing import Optional
from uuid import UUID

from shared.base_classes.entity import TenantEntity


class AmendmentType:
    """نوع الحاقیه."""
    VALUE_CHANGE = "VALUE_CHANGE"          # تغییر مبلغ
    DURATION_CHANGE = "DURATION_CHANGE"    # تغییر مدت
    SCOPE_CHANGE = "SCOPE_CHANGE"          # تغییر محدوده
    PARTY_CHANGE = "PARTY_CHANGE"          # تغییر طرفین
    CLAUSE_CHANGE = "CLAUSE_CHANGE"        # تغییر بندها
    COMBINED = "COMBINED"                  # ترکیبی
    OTHER = "OTHER"                        # سایر


class AmendmentStatus:
    """وضعیت الحاقیه."""
    DRAFT = "DRAFT"
    PENDING_APPROVAL = "PENDING_APPROVAL"
    APPROVED = "APPROVED"
    REJECTED = "REJECTED"
    APPLIED = "APPLIED"


@dataclass
class ContractAmendment(TenantEntity):
    """
    الحاقیه قرارداد.

    Rules:
    - فقط برای قراردادهای فعال یا تعلیق‌شده ایجاد شود
    - بعد از تأیید، تغییرات روی قرارداد اعمال شود
    - شماره الحاقیه باید در هر قرارداد یکتا باشد
    """

    contract_id: Optional[UUID] = None
    amendment_number: int = 0
    title: str = ""
    description: str = ""
    reason: str = ""
    amendment_type: str = AmendmentType.OTHER
    status: str = AmendmentStatus.DRAFT
    effective_date: Optional[date] = None

    # Change tracking
    old_values: dict = field(default_factory=dict)
    new_values: dict = field(default_factory=dict)

    # Value change
    old_total_value: Optional[Decimal] = None
    new_total_value: Optional[Decimal] = None

    # Duration change
    old_end_date: Optional[date] = None
    new_end_date: Optional[date] = None

    # Approval
    approved_by: Optional[UUID] = None
    approved_at: Optional[date] = None
    rejected_by: Optional[UUID] = None
    rejected_reason: str = ""

    notes: str = ""

    def approve(self, approved_by: UUID) -> None:
        """تأیید الحاقیه."""
        if self.status != AmendmentStatus.PENDING_APPROVAL:
            raise ValueError("فقط الحاقیه‌های در انتظار تأیید قابل تأیید هستند")
        self.status = AmendmentStatus.APPROVED
        self.approved_by = approved_by
        self.approved_at = date.today()

    def reject(self, rejected_by: UUID, reason: str = "") -> None:
        """رد الحاقیه."""
        if self.status != AmendmentStatus.PENDING_APPROVAL:
            raise ValueError("فقط الحاقیه‌های در انتظار تأیید قابل رد هستند")
        self.status = AmendmentStatus.REJECTED
        self.rejected_by = rejected_by
        self.rejected_reason = reason

    @property
    def value_change(self) -> Optional[Decimal]:
        """تغییر مبلغ."""
        if self.old_total_value is not None and self.new_total_value is not None:
            return self.new_total_value - self.old_total_value
        return None
