"""
PPM Domain — Cross-Project Dependency Entity

CrossProjectDependency — وابستگی بین پروژه‌ای.
"""

from dataclasses import dataclass, field
from typing import Optional
from uuid import UUID

from shared.base_classes.entity import TenantEntity


# --- Constants ---
DEPENDENCY_TYPE_FS = "FS"   # Finish-to-Start
DEPENDENCY_TYPE_SS = "SS"   # Start-to-Start
DEPENDENCY_TYPE_FF = "FF"   # Finish-to-Finish
DEPENDENCY_TYPE_SF = "SF"   # Start-to-Finish

DEPENDENCY_TYPES = [DEPENDENCY_TYPE_FS, DEPENDENCY_TYPE_SS, DEPENDENCY_TYPE_FF, DEPENDENCY_TYPE_SF]

STATUS_ACTIVE = "active"
STATUS_RESOLVED = "resolved"

DEPENDENCY_STATUSES = [STATUS_ACTIVE, STATUS_RESOLVED]


@dataclass
class CrossProjectDependency(TenantEntity):
    """
    وابستگی بین پروژه‌ای — Aggregate Root.

    نشان‌دهنده وابستگی بین دو پروژه یا مایلستون
    در سطح پرتفولیو/برنامه.
    """

    # --- Predecessor / Successor ---
    predecessor_project_id: Optional[UUID] = None
    successor_project_id: Optional[UUID] = None
    predecessor_milestone_id: Optional[UUID] = None
    successor_milestone_id: Optional[UUID] = None

    # --- Dependency Info ---
    dependency_type: str = DEPENDENCY_TYPE_FS  # FS, SS, FF, SF
    lag_days: int = 0
    status: str = STATUS_ACTIVE
    impact_description: str = ""

    # --- Extra ---
    metadata: dict = field(default_factory=dict)

    # ── Business Rules ──

    def resolve(self) -> None:
        """علامت‌گذاری وابستگی به عنوان حل‌شده."""
        self.status = STATUS_RESOLVED

    def reactivate(self) -> None:
        """فعال‌سازی مجدد وابستگی."""
        self.status = STATUS_ACTIVE

    def validate_dependency_type(self) -> bool:
        """بررسی معتبر بودن نوع وابستگی."""
        return self.dependency_type in DEPENDENCY_TYPES
