"""
PPM Module — Public Events Contract

رویدادهای عمومی ماژول مدیریت پرتفولیو و برنامه.
سایر ماژول‌ها فقط از این فایل import می‌کنند.
"""

from dataclasses import dataclass
from datetime import datetime
from decimal import Decimal
from typing import Optional
from uuid import UUID


@dataclass(frozen=True)
class PPMEvent:
    """رویداد پایه ماژول PPM."""
    event_id: UUID
    tenant_id: UUID
    occurred_at: datetime
    version: int = 1


@dataclass(frozen=True)
class PortfolioCreated(PPMEvent):
    event_type: str = "ppm.portfolio.created"
    portfolio_id: Optional[UUID] = None
    code: str = ""
    name: str = ""


@dataclass(frozen=True)
class PortfolioUpdated(PPMEvent):
    event_type: str = "ppm.portfolio.updated"
    portfolio_id: Optional[UUID] = None


@dataclass(frozen=True)
class PortfolioClosed(PPMEvent):
    event_type: str = "ppm.portfolio.closed"
    portfolio_id: Optional[UUID] = None


@dataclass(frozen=True)
class ProgramCreated(PPMEvent):
    event_type: str = "ppm.program.created"
    program_id: Optional[UUID] = None
    portfolio_id: Optional[UUID] = None
    code: str = ""
    name: str = ""


@dataclass(frozen=True)
class ProgramUpdated(PPMEvent):
    event_type: str = "ppm.program.updated"
    program_id: Optional[UUID] = None


@dataclass(frozen=True)
class ProgramClosed(PPMEvent):
    event_type: str = "ppm.program.closed"
    program_id: Optional[UUID] = None


@dataclass(frozen=True)
class ProgramProjectAdded(PPMEvent):
    event_type: str = "ppm.program.project_added"
    program_id: Optional[UUID] = None
    project_id: Optional[UUID] = None
    role: str = ""


@dataclass(frozen=True)
class ProgramProjectRemoved(PPMEvent):
    event_type: str = "ppm.program.project_removed"
    program_id: Optional[UUID] = None
    project_id: Optional[UUID] = None


@dataclass(frozen=True)
class BusinessCaseCreated(PPMEvent):
    event_type: str = "ppm.business_case.created"
    business_case_id: Optional[UUID] = None
    title: str = ""


@dataclass(frozen=True)
class BusinessCaseApproved(PPMEvent):
    event_type: str = "ppm.business_case.approved"
    business_case_id: Optional[UUID] = None


@dataclass(frozen=True)
class BusinessCaseRejected(PPMEvent):
    event_type: str = "ppm.business_case.rejected"
    business_case_id: Optional[UUID] = None


@dataclass(frozen=True)
class ScoringCompleted(PPMEvent):
    event_type: str = "ppm.scoring.completed"
    scoring_model_id: Optional[UUID] = None
    portfolio_id: Optional[UUID] = None


@dataclass(frozen=True)
class BenefitMeasured(PPMEvent):
    event_type: str = "ppm.benefit.measured"
    benefit_id: Optional[UUID] = None
    value: Optional[Decimal] = None


@dataclass(frozen=True)
class CapacityAnalyzed(PPMEvent):
    event_type: str = "ppm.capacity.analyzed"
    portfolio_id: Optional[UUID] = None


@dataclass(frozen=True)
class CrossProjectDependencyCreated(PPMEvent):
    event_type: str = "ppm.dependency.created"
    dependency_id: Optional[UUID] = None
    predecessor_project_id: Optional[UUID] = None
    successor_project_id: Optional[UUID] = None


@dataclass(frozen=True)
class CrossProjectDependencyResolved(PPMEvent):
    event_type: str = "ppm.dependency.resolved"
    dependency_id: Optional[UUID] = None
