"""
CLM Public Commands - Module Contract.

دستورات عمومی ماژول CLM که سایر ماژول‌ها می‌توانند فراخوانی کنند.
"""
from dataclasses import dataclass, field
from datetime import date
from decimal import Decimal
from typing import Optional, List
from uuid import UUID


@dataclass
class CreateContract:
    """ایجاد قرارداد جدید."""
    tenant_id: UUID
    title: str
    category: str
    contract_type: str
    start_date: date
    end_date: date
    total_value: Decimal
    contract_number: str = ""
    description: str = ""
    priority: str = "NORMAL"
    currency_id: Optional[UUID] = None
    template_id: Optional[UUID] = None
    project_id: Optional[UUID] = None
    org_unit_id: Optional[UUID] = None
    responsible_person_id: Optional[UUID] = None
    metadata: dict = field(default_factory=dict)


@dataclass
class ApproveContract:
    """تأیید قرارداد."""
    tenant_id: UUID
    contract_id: UUID
    approved_by: UUID
    notes: str = ""


@dataclass
class ActivateContract:
    """فعال‌سازی قرارداد."""
    tenant_id: UUID
    contract_id: UUID


@dataclass
class SuspendContract:
    """تعلیق قرارداد."""
    tenant_id: UUID
    contract_id: UUID
    reason: str = ""


@dataclass
class TerminateContract:
    """فسخ قرارداد."""
    tenant_id: UUID
    contract_id: UUID
    reason: str = ""


@dataclass
class RenewContract:
    """تمدید قرارداد."""
    tenant_id: UUID
    contract_id: UUID
    new_end_date: date
    new_value: Optional[Decimal] = None
    notes: str = ""


@dataclass
class CreateAmendment:
    """ایجاد الحاقیه."""
    tenant_id: UUID
    contract_id: UUID
    title: str
    amendment_type: str
    description: str = ""
    reason: str = ""
    new_total_value: Optional[Decimal] = None
    new_end_date: Optional[date] = None


@dataclass
class ApproveAmendment:
    """تأیید الحاقیه."""
    tenant_id: UUID
    amendment_id: UUID
    approved_by: UUID


@dataclass
class CompleteMilestone:
    """تکمیل مرحله قرارداد."""
    tenant_id: UUID
    milestone_id: UUID
    actual_date: Optional[date] = None
    notes: str = ""


@dataclass
class AddContractParty:
    """افزودن طرف قرارداد."""
    tenant_id: UUID
    contract_id: UUID
    party_role: str
    business_partner_id: Optional[UUID] = None
    legal_entity_id: Optional[UUID] = None
    signer_name: str = ""
    signer_title: str = ""
    is_primary: bool = False


@dataclass
class CreateContractFromTemplate:
    """ایجاد قرارداد از قالب."""
    tenant_id: UUID
    template_id: UUID
    title: str
    start_date: date
    end_date: date
    total_value: Decimal
    contract_number: str = ""
    project_id: Optional[UUID] = None
    metadata: dict = field(default_factory=dict)
