"""
PPM Domain — Business Case & CashFlow Entities

کیس تجاری — توجیه‌نامه مالی و راهبردی برنامه/پروژه.
CashFlowProjection — پیش‌بینی جریان نقدی سالانه.
"""

from dataclasses import dataclass, field
from decimal import Decimal
from typing import Optional
from uuid import UUID

from shared.base_classes.entity import TenantEntity

from ..value_objects.common import BusinessCaseStatus


@dataclass
class BusinessCase(TenantEntity):
    """
    کیس تجاری — Aggregate Root.

    توجیه‌نامه مالی و راهبردی برای سرمایه‌گذاری
    در یک برنامه یا پروژه.
    """

    # --- Identity ---
    title: str = ""
    description: str = ""

    # --- Reference (cross-module UUID) ---
    program_id: Optional[UUID] = None   # FK → Program (nullable)
    project_id: Optional[UUID] = None   # UUID ref → PM.Project (nullable)

    # --- Status ---
    status: BusinessCaseStatus = BusinessCaseStatus.DRAFT

    # --- People ---
    sponsor_id: Optional[UUID] = None      # → User (حامی)
    prepared_by_id: Optional[UUID] = None  # → User (تهیه‌کننده)

    # --- Strategic ---
    strategic_fit_score: Decimal = Decimal("0")  # 1-10

    # --- Financial ---
    total_investment: Decimal = Decimal("0")
    expected_revenue: Decimal = Decimal("0")
    expected_savings: Decimal = Decimal("0")
    payback_period_months: int = 0

    # --- Narrative ---
    assumptions: str = ""
    constraints: str = ""
    risks_summary: str = ""

    # --- Metadata ---
    metadata: Optional[dict] = field(default_factory=dict)

    # ─── Business Rules ───

    def can_submit(self) -> bool:
        return self.status == BusinessCaseStatus.DRAFT and self.title != ""

    def submit(self) -> None:
        if not self.can_submit():
            raise ValueError("کیس تجاری قابل ارسال نیست.")
        self.status = BusinessCaseStatus.SUBMITTED

    def approve(self) -> None:
        if self.status != BusinessCaseStatus.SUBMITTED:
            raise ValueError("فقط کیس ارسال‌شده قابل تأیید است.")
        self.status = BusinessCaseStatus.APPROVED

    def reject(self) -> None:
        if self.status != BusinessCaseStatus.SUBMITTED:
            raise ValueError("فقط کیس ارسال‌شده قابل رد است.")
        self.status = BusinessCaseStatus.REJECTED

    @property
    def net_benefit(self) -> Decimal:
        return (self.expected_revenue + self.expected_savings) - self.total_investment

    @property
    def roi(self) -> Decimal:
        if self.total_investment == 0:
            return Decimal("0")
        return (self.net_benefit / self.total_investment) * 100


@dataclass
class CashFlowProjection(TenantEntity):
    """
    پیش‌بینی جریان نقدی سالانه.

    هر ردیف نشان‌دهنده یک سال مالی است.
    """

    business_case_id: Optional[UUID] = None  # FK → BusinessCase
    year: int = 0                            # شماره سال (1, 2, 3, ...)
    investment: Decimal = Decimal("0")       # سرمایه‌گذاری
    revenue: Decimal = Decimal("0")          # درآمد
    savings: Decimal = Decimal("0")          # صرفه‌جویی
    operational_cost: Decimal = Decimal("0") # هزینه عملیاتی

    @property
    def net_cash_flow(self) -> Decimal:
        return (self.revenue + self.savings) - (self.investment + self.operational_cost)
