"""
CLM Value Objects.

اشیاء ارزشی ماژول قراردادها — immutable و بدون هویت.
"""
from dataclasses import dataclass
from datetime import date
from decimal import Decimal
from typing import Optional

from shared.base_classes.value_object import BaseValueObject


@dataclass(frozen=True)
class ContractValue(BaseValueObject):
    """مبلغ قرارداد."""
    amount: Decimal = Decimal("0")
    currency: str = "IRR"

    def __post_init__(self):
        if self.amount < 0:
            raise ValueError("مبلغ نمی‌تواند منفی باشد")


@dataclass(frozen=True)
class ContractPeriod(BaseValueObject):
    """دوره زمانی قرارداد."""
    start_date: date = None
    end_date: date = None

    def __post_init__(self):
        if self.start_date and self.end_date and self.end_date < self.start_date:
            raise ValueError("تاریخ پایان نمی‌تواند قبل از تاریخ شروع باشد")

    @property
    def duration_days(self) -> Optional[int]:
        if self.start_date and self.end_date:
            return (self.end_date - self.start_date).days
        return None


@dataclass(frozen=True)
class PaymentTerms(BaseValueObject):
    """شرایط پرداخت."""
    days: int = 30
    description: str = ""
    advance_percent: Decimal = Decimal("0")
    retention_percent: Decimal = Decimal("0")

    def __post_init__(self):
        if self.days < 0:
            raise ValueError("تعداد روز نمی‌تواند منفی باشد")
        if not (0 <= self.advance_percent <= 100):
            raise ValueError("درصد پیش‌پرداخت باید بین ۰ و ۱۰۰ باشد")


@dataclass(frozen=True)
class Guarantee(BaseValueObject):
    """ضمانتنامه."""
    amount: Decimal = Decimal("0")
    guarantee_type: str = ""
    expiry_date: Optional[date] = None
    issuer: str = ""
    reference_number: str = ""
