"""
PPM Module — Public Types Contract

انواع داده عمومی ماژول مدیریت پرتفولیو و برنامه.
سایر ماژول‌ها فقط از این فایل import می‌کنند.
"""

from dataclasses import dataclass, field
from datetime import date, datetime
from decimal import Decimal
from typing import Dict, List, Optional
from uuid import UUID


@dataclass(frozen=True)
class PortfolioDTO:
    id: UUID
    code: str
    name: str
    status: str
    owner_id: Optional[UUID] = None
    total_budget: Optional[Decimal] = None
    allocated_budget: Optional[Decimal] = None
    start_date: Optional[date] = None
    end_date: Optional[date] = None


@dataclass(frozen=True)
class ProgramDTO:
    id: UUID
    code: str
    name: str
    portfolio_id: Optional[UUID] = None
    status: str = ""
    manager_id: Optional[UUID] = None
    budget: Optional[Decimal] = None
    progress: Optional[Decimal] = None


@dataclass(frozen=True)
class ProgramProjectDTO:
    id: UUID
    program_id: UUID
    project_id: UUID
    role: str = "core"
    priority: int = 0


@dataclass(frozen=True)
class BusinessCaseDTO:
    id: UUID
    title: str
    status: str
    program_id: Optional[UUID] = None
    portfolio_id: Optional[UUID] = None
    total_investment: Optional[Decimal] = None
    npv: Optional[Decimal] = None
    irr: Optional[Decimal] = None
    payback_period_months: Optional[int] = None


@dataclass(frozen=True)
class ScoringModelDTO:
    id: UUID
    name: str
    portfolio_id: Optional[UUID] = None
    is_active: bool = True


@dataclass(frozen=True)
class BenefitPlanDTO:
    id: UUID
    name: str
    program_id: Optional[UUID] = None
    portfolio_id: Optional[UUID] = None
    is_active: bool = True


@dataclass(frozen=True)
class BenefitDTO:
    id: UUID
    title: str
    benefit_type: str = ""
    status: str = ""
    target_value: Optional[Decimal] = None
    actual_value: Optional[Decimal] = None


@dataclass(frozen=True)
class CapacityPlanDTO:
    id: UUID
    name: str
    portfolio_id: Optional[UUID] = None
    period_start: Optional[date] = None
    period_end: Optional[date] = None
    is_active: bool = True


@dataclass(frozen=True)
class CrossProjectDependencyDTO:
    id: UUID
    predecessor_project_id: Optional[UUID] = None
    successor_project_id: Optional[UUID] = None
    dependency_type: str = "FS"
    lag_days: int = 0
    status: str = "active"
