"""
PM Module — Public Contracts: Types/DTOs

انواع عمومی ماژول مدیریت پروژه — قراردادهای بین ماژولی.
"""

from dataclasses import dataclass, field
from datetime import date
from decimal import Decimal
from typing import Optional, List
from uuid import UUID
from enum import Enum


# ─── Enums (public) ──────────────────────────────────────────────────

class ProjectStatusDTO(str, Enum):
    DRAFT = "draft"
    PLANNING = "planning"
    ACTIVE = "active"
    ON_HOLD = "on_hold"
    COMPLETED = "completed"
    CANCELLED = "cancelled"
    ARCHIVED = "archived"


class TaskStatusDTO(str, Enum):
    NOT_STARTED = "not_started"
    IN_PROGRESS = "in_progress"
    COMPLETED = "completed"
    ON_HOLD = "on_hold"
    CANCELLED = "cancelled"


class ResourceTypeDTO(str, Enum):
    HUMAN = "human"
    EQUIPMENT = "equipment"
    MATERIAL = "material"


# ─── DTOs ─────────────────────────────────────────────────────────────

@dataclass(frozen=True)
class ProjectSummaryDTO:
    """خلاصه پروژه — برای استفاده بین‌ماژولی."""
    id: UUID
    code: str
    title: str
    status: str
    project_type: str
    company_id: Optional[UUID] = None
    manager_id: Optional[UUID] = None
    progress: int = 0
    total_budget: Decimal = Decimal("0")
    actual_cost: Decimal = Decimal("0")
    planned_start: Optional[date] = None
    planned_end: Optional[date] = None


@dataclass(frozen=True)
class TaskSummaryDTO:
    """خلاصه تسک — برای استفاده بین‌ماژولی."""
    id: UUID
    project_id: UUID
    code: str
    title: str
    status: str
    progress: int = 0
    assignee_id: Optional[UUID] = None
    planned_start: Optional[date] = None
    planned_end: Optional[date] = None
    is_critical: bool = False
    is_milestone: bool = False


@dataclass(frozen=True)
class ResourceSummaryDTO:
    """خلاصه منبع — برای استفاده بین‌ماژولی."""
    id: UUID
    name: str
    code: str
    resource_type: str
    employee_id: Optional[UUID] = None
    is_active: bool = True


@dataclass(frozen=True)
class EVMDataDTO:
    """داده‌های EVM."""
    planned_value: Decimal = Decimal("0")
    earned_value: Decimal = Decimal("0")
    actual_cost: Decimal = Decimal("0")
    budget_at_completion: Decimal = Decimal("0")
    cost_variance: Decimal = Decimal("0")
    schedule_variance: Decimal = Decimal("0")
    cpi: Optional[Decimal] = None
    spi: Optional[Decimal] = None
    eac: Optional[Decimal] = None
    etc: Optional[Decimal] = None
    vac: Optional[Decimal] = None


@dataclass(frozen=True)
class PortfolioSummaryDTO:
    """خلاصه پورتفولیو."""
    total_projects: int = 0
    active_projects: int = 0
    completed_projects: int = 0
    total_budget: Decimal = Decimal("0")
    total_actual_cost: Decimal = Decimal("0")
    average_progress: int = 0
    at_risk_count: int = 0
    overdue_count: int = 0


@dataclass(frozen=True)
class IssueSummaryDTO:
    """خلاصه مسئله — برای استفاده بین‌ماژولی."""
    id: UUID
    project_id: UUID
    code: str
    title: str
    category: str
    severity: str
    priority: str
    status: str
    assignee_id: Optional[UUID] = None
    is_overdue: bool = False
    is_critical: bool = False


@dataclass(frozen=True)
class OBSNodeSummaryDTO:
    """خلاصه گره OBS — برای استفاده بین‌ماژولی."""
    id: UUID
    project_id: UUID
    code: str
    name: str
    node_type: str
    level: int
    manager_id: Optional[UUID] = None
    parent_id: Optional[UUID] = None
    is_active: bool = True


@dataclass(frozen=True)
class RBSNodeSummaryDTO:
    """خلاصه گره RBS — برای استفاده بین‌ماژولی."""
    id: UUID
    project_id: UUID
    code: str
    name: str
    node_type: str
    level: int
    resource_type: str = ""
    unit: str = ""
    parent_id: Optional[UUID] = None
    is_active: bool = True


@dataclass(frozen=True)
class QualityPlanSummaryDTO:
    """خلاصه طرح کیفیت — برای استفاده بین‌ماژولی."""
    id: UUID
    project_id: UUID
    name: str
    status: str
    version: str = "1.0"
    quality_manager_id: Optional[UUID] = None


@dataclass(frozen=True)
class InspectionSummaryDTO:
    """خلاصه بازرسی — برای استفاده بین‌ماژولی."""
    id: UUID
    project_id: UUID
    code: str
    title: str
    inspection_type: str
    status: str
    result: str = "na"
    inspector_id: Optional[UUID] = None


@dataclass(frozen=True)
class NCRSummaryDTO:
    """خلاصه عدم انطباق — برای استفاده بین‌ماژولی."""
    id: UUID
    project_id: UUID
    code: str
    title: str
    severity: str
    status: str
    assigned_to_id: Optional[UUID] = None
    is_overdue: bool = False
