"""
PPM Domain — Benefit Realization Entities

BenefitPlan — برنامه تحقق منافع.
Benefit — منفعت قابل اندازه‌گیری.
BenefitMeasurement — اندازه‌گیری منفعت.
"""

from dataclasses import dataclass, field
from datetime import date, datetime
from decimal import Decimal
from typing import Optional
from uuid import UUID

from shared.base_classes.entity import TenantEntity

from ..value_objects.common import BenefitType, BenefitStatus, MeasurementFrequency


@dataclass
class BenefitPlan(TenantEntity):
    """
    برنامه تحقق منافع — Aggregate Root.

    هر برنامه (Program) یا پرتفولیو می‌تواند یک BenefitPlan
    داشته باشد که منافع مورد انتظار را تعریف و ردگیری می‌کند.
    """

    # --- Identity ---
    name: str = ""
    description: str = ""

    # --- Reference ---
    program_id: Optional[UUID] = None      # FK → Program
    portfolio_id: Optional[UUID] = None    # FK → Portfolio

    # --- Status ---
    is_active: bool = True

    # --- Metadata ---
    metadata: Optional[dict] = field(default_factory=dict)

    # ─── Business Rules ───

    def activate(self):
        self.is_active = True

    def deactivate(self):
        self.is_active = False


@dataclass
class Benefit(TenantEntity):
    """
    منفعت قابل اندازه‌گیری.

    هر منفعت به یک BenefitPlan متعلق است و دارای
    مقدار هدف و مقدار واقعی است.
    """

    # --- Identity ---
    benefit_plan_id: UUID = None
    title: str = ""
    description: str = ""

    # --- Type & Category ---
    benefit_type: BenefitType = BenefitType.FINANCIAL
    category: str = ""   # آزاد — strategic, operational, customer, etc.

    # --- Measurement ---
    target_value: Decimal = Decimal("0")
    actual_value: Decimal = Decimal("0")
    measurement_method: str = ""
    frequency: MeasurementFrequency = MeasurementFrequency.QUARTERLY

    # --- People ---
    owner_id: Optional[UUID] = None   # → User (مسئول)

    # --- Status ---
    status: BenefitStatus = BenefitStatus.IDENTIFIED

    # --- Timeline ---
    target_date: Optional[date] = None

    # --- Metadata ---
    metadata: Optional[dict] = field(default_factory=dict)

    # ─── Business Rules ───

    def plan(self):
        if self.status == BenefitStatus.IDENTIFIED:
            self.status = BenefitStatus.PLANNED

    def realize(self):
        if self.status == BenefitStatus.PLANNED:
            self.status = BenefitStatus.REALIZED

    def fail(self):
        if self.status in (BenefitStatus.IDENTIFIED, BenefitStatus.PLANNED):
            self.status = BenefitStatus.FAILED

    def update_actual(self, value: Decimal):
        self.actual_value = value

    @property
    def realization_percentage(self) -> Decimal:
        """درصد تحقق منفعت."""
        if self.target_value and self.target_value > 0:
            return (self.actual_value / self.target_value) * 100
        return Decimal("0")


@dataclass
class BenefitMeasurement(TenantEntity):
    """
    اندازه‌گیری منفعت.

    ثبت مقدار اندازه‌گیری شده در یک تاریخ مشخص.
    """

    # --- Identity ---
    benefit_id: UUID = None
    measurement_date: Optional[date] = None
    value: Decimal = Decimal("0")
    notes: str = ""

    # --- People ---
    measured_by_id: Optional[UUID] = None  # → User
