"""
ContractMilestone — Domain Entity.

مراحل و نقاط عطف قرارداد.
"""
from dataclasses import dataclass
from datetime import date
from decimal import Decimal
from typing import Optional
from uuid import UUID

from shared.base_classes.entity import TenantEntity


class MilestoneType:
    """نوع مرحله."""
    PAYMENT = "PAYMENT"                  # پرداخت
    DELIVERY = "DELIVERY"                # تحویل
    PHASE_COMPLETION = "PHASE_COMPLETION" # اتمام فاز
    INSPECTION = "INSPECTION"            # بازرسی
    ACCEPTANCE = "ACCEPTANCE"            # تحویل‌گیری
    CUSTOM = "CUSTOM"                    # سفارشی


class MilestoneStatus:
    """وضعیت مرحله."""
    PENDING = "PENDING"
    IN_PROGRESS = "IN_PROGRESS"
    COMPLETED = "COMPLETED"
    OVERDUE = "OVERDUE"
    CANCELLED = "CANCELLED"
    SKIPPED = "SKIPPED"


@dataclass
class ContractMilestone(TenantEntity):
    """
    مرحله قرارداد.

    Rules:
    - تاریخ واقعی فقط بعد از تکمیل ثبت شود
    - مبلغ نمی‌تواند از مبلغ کل قرارداد بیشتر باشد
    """

    contract_id: Optional[UUID] = None
    title: str = ""
    description: str = ""
    milestone_type: str = MilestoneType.PAYMENT
    status: str = MilestoneStatus.PENDING

    # Dates
    planned_date: Optional[date] = None
    actual_date: Optional[date] = None
    due_date: Optional[date] = None

    # Financial
    amount: Decimal = Decimal("0")
    currency_id: Optional[UUID] = None
    invoice_number: str = ""
    payment_status: str = ""  # PENDING, PAID, PARTIAL, OVERDUE

    # Deliverable
    deliverable_description: str = ""
    acceptance_criteria: str = ""
    accepted_by: Optional[UUID] = None
    accepted_at: Optional[date] = None

    # Penalty
    has_penalty: bool = False
    penalty_amount_per_day: Decimal = Decimal("0")

    order: int = 0
    notes: str = ""

    def complete(self, actual_date: Optional[date] = None) -> None:
        """تکمیل مرحله."""
        if self.status in (MilestoneStatus.COMPLETED, MilestoneStatus.CANCELLED):
            raise ValueError("این مرحله قبلاً تکمیل یا لغو شده")
        self.status = MilestoneStatus.COMPLETED
        self.actual_date = actual_date or date.today()

    @property
    def is_overdue(self) -> bool:
        """آیا مرحله عقب‌افتاده؟"""
        if self.due_date and self.status in (MilestoneStatus.PENDING, MilestoneStatus.IN_PROGRESS):
            return date.today() > self.due_date
        return False

    @property
    def delay_days(self) -> int:
        """تعداد روزهای تأخیر."""
        if self.is_overdue:
            return (date.today() - self.due_date).days
        if self.actual_date and self.due_date and self.actual_date > self.due_date:
            return (self.actual_date - self.due_date).days
        return 0
