"""
PM Module — Risk Entity

مدیریت ریسک پروژه.
"""

from dataclasses import dataclass, field
from datetime import date
from decimal import Decimal
from typing import Optional, List
from uuid import UUID, uuid4

from shared.base_classes.entity import TenantEntity

from ..value_objects.common import (
    RiskProbability,
    RiskImpact,
    RiskStatus,
    RiskResponseStrategy,
    RiskScore,
)


@dataclass
class Risk(TenantEntity):
    """
    ریسک پروژه.
    """

    project_id: UUID = field(default_factory=uuid4)

    code: str = ""
    title: str = ""
    description: str = ""
    category: str = ""          # دسته‌بندی: فنی، مالی، منابع، ...

    # --- Assessment ---
    probability: RiskProbability = RiskProbability.MEDIUM
    impact: RiskImpact = RiskImpact.MODERATE
    status: RiskStatus = RiskStatus.IDENTIFIED

    # --- Response ---
    response_strategy: RiskResponseStrategy = RiskResponseStrategy.MITIGATE
    response_plan: str = ""
    mitigation_actions: str = ""

    # --- Assignment ---
    owner_id: Optional[UUID] = None       # → User (صاحب ریسک)

    # --- Impact ---
    cost_impact: Decimal = Decimal("0")
    schedule_impact_days: int = 0
    affected_tasks: Optional[list] = field(default_factory=list)  # [UUID]

    # --- Dates ---
    identified_date: Optional[date] = None
    due_date: Optional[date] = None
    closed_date: Optional[date] = None

    # --- Metadata ---
    notes: str = ""
    metadata: Optional[dict] = field(default_factory=dict)

    @property
    def risk_score(self) -> RiskScore:
        return RiskScore(probability=self.probability, impact=self.impact)

    @property
    def score_value(self) -> int:
        return self.risk_score.score

    @property
    def risk_level(self) -> str:
        return self.risk_score.level

    def close(self) -> None:
        self.status = RiskStatus.CLOSED
        self.closed_date = date.today()

    def mark_occurred(self) -> None:
        self.status = RiskStatus.OCCURRED
