"""
PPM Domain — Capacity Planning Entities

CapacityPlan — برنامه ظرفیت.
ResourceDemand — تقاضای منابع.
ResourceSupply — عرضه منابع.
"""

from dataclasses import dataclass, field
from datetime import date
from decimal import Decimal
from typing import Optional
from uuid import UUID

from shared.base_classes.entity import TenantEntity


@dataclass
class CapacityPlan(TenantEntity):
    """
    برنامه ظرفیت — Aggregate Root.

    تحلیل عرضه و تقاضای منابع برای یک پرتفولیو
    در یک بازه زمانی مشخص.
    """

    # --- Identity ---
    name: str = ""
    description: str = ""

    # --- Reference ---
    portfolio_id: Optional[UUID] = None  # FK → Portfolio

    # --- Period ---
    period_start: Optional[date] = None
    period_end: Optional[date] = None

    # --- Status ---
    is_active: bool = True

    # --- Metadata ---
    metadata: Optional[dict] = field(default_factory=dict)

    # ─── Business Rules ───

    def activate(self):
        self.is_active = True

    def deactivate(self):
        self.is_active = False


@dataclass
class ResourceDemand(TenantEntity):
    """
    تقاضای منابع.

    ساعات مورد نیاز از یک نوع منبع/مهارت
    برای یک پروژه در یک دوره مشخص.
    """

    # --- Identity ---
    capacity_plan_id: UUID = None
    resource_type: str = ""         # نوع منبع / مهارت
    project_id: Optional[UUID] = None   # UUID ref → PM.Project

    # --- Demand ---
    demand_hours: Decimal = Decimal("0")
    period: str = ""   # e.g. "2026-Q1", "2026-01", etc.

    # --- Notes ---
    notes: str = ""


@dataclass
class ResourceSupply(TenantEntity):
    """
    عرضه منابع.

    ساعات در دسترس از یک نوع منبع/مهارت
    در یک دوره مشخص.
    """

    # --- Identity ---
    capacity_plan_id: UUID = None
    resource_type: str = ""         # نوع منبع / مهارت

    # --- Supply ---
    available_hours: Decimal = Decimal("0")
    period: str = ""   # e.g. "2026-Q1", "2026-01", etc.

    # --- Notes ---
    notes: str = ""
