"""
PPM ORM Models — Infrastructure Layer.

مدل‌های Django ORM ماژول مدیریت پرتفولیو و برنامه.
تمام جداول با پیشوند ppm_ هستند.
verbose_nameها به فارسی.
"""
import uuid

from django.conf import settings
from django.db import models
from django.utils.translation import gettext_lazy as _
from apps.core.tenant.models import TenantAwareModel


# ═══════════════════════════════════════════════════
# 1️⃣ Portfolio
# ═══════════════════════════════════════════════════

class PortfolioModel(TenantAwareModel):
    """مدل ORM — پرتفولیو."""

    class Status(models.TextChoices):
        DRAFT = "draft", _("پیش‌نویس")
        ACTIVE = "active", _("فعال")
        ON_HOLD = "on_hold", _("متوقف")
        CLOSED = "closed", _("بسته‌شده")
        ARCHIVED = "archived", _("آرشیوشده")

    class ReviewCycle(models.TextChoices):
        MONTHLY = "monthly", _("ماهانه")
        QUARTERLY = "quarterly", _("سه‌ماهه")
        SEMI_ANNUAL = "semi_annual", _("شش‌ماهه")
        YEARLY = "yearly", _("سالانه")

    class RiskTolerance(models.TextChoices):
        LOW = "low", _("پایین")
        MEDIUM = "medium", _("متوسط")
        HIGH = "high", _("بالا")

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    code = models.CharField(_("کد پرتفولیو"), max_length=50, db_index=True)
    name = models.CharField(_("نام"), max_length=300)
    description = models.TextField(_("توضیحات"), blank=True)

    parent = models.ForeignKey(
        "self", on_delete=models.SET_NULL,
        null=True, blank=True, related_name="children",
        verbose_name=_("پرتفولیو مادر"),
    )

    status = models.CharField(
        _("وضعیت"), max_length=20,
        choices=Status.choices, default=Status.DRAFT, db_index=True,
    )

    strategic_alignment_score = models.DecimalField(
        _("امتیاز هم‌راستایی راهبردی"), max_digits=5, decimal_places=2, default=0,
    )
    risk_tolerance = models.CharField(
        _("تحمل ریسک"), max_length=20,
        choices=RiskTolerance.choices, default=RiskTolerance.MEDIUM,
    )

    total_budget = models.DecimalField(
        _("بودجه کل"), max_digits=18, decimal_places=0, default=0,
    )
    allocated_budget = models.DecimalField(
        _("بودجه تخصیص‌یافته"), max_digits=18, decimal_places=0, default=0,
    )

    start_date = models.DateField(_("تاریخ شروع"), null=True, blank=True)
    end_date = models.DateField(_("تاریخ پایان"), null=True, blank=True)

    review_cycle = models.CharField(
        _("دوره بازبینی"), max_length=20,
        choices=ReviewCycle.choices, default=ReviewCycle.QUARTERLY,
    )

    owner = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.SET_NULL,
        null=True, blank=True, related_name="owned_portfolios",
        verbose_name=_("مالک"),
    )
    company_id = models.UUIDField(_("شرکت"), null=True, blank=True, db_index=True)
    org_unit_id = models.UUIDField(_("واحد سازمانی"), null=True, blank=True, db_index=True)

    tags = models.JSONField(_("برچسب‌ها"), default=list, blank=True)
    metadata = models.JSONField(_("متادیتا"), default=dict, blank=True)

    created_at = models.DateTimeField(_("تاریخ ایجاد"), auto_now_add=True)
    updated_at = models.DateTimeField(_("تاریخ بروزرسانی"), auto_now=True)

    class Meta:
        db_table = "ppm_portfolio"
        verbose_name = _("پرتفولیو")
        verbose_name_plural = _("پرتفولیوها")
        ordering = ["-created_at"]
        unique_together = [["tenant", "code"]]

    def __str__(self):
        return f"{self.code} — {self.name}"


# ═══════════════════════════════════════════════════
# 2️⃣ Program
# ═══════════════════════════════════════════════════

class ProgramModel(TenantAwareModel):
    """مدل ORM — برنامه."""

    class Status(models.TextChoices):
        DRAFT = "draft", _("پیش‌نویس")
        ACTIVE = "active", _("فعال")
        ON_HOLD = "on_hold", _("متوقف")
        COMPLETED = "completed", _("تکمیل‌شده")
        CLOSED = "closed", _("بسته‌شده")
        CANCELLED = "cancelled", _("لغوشده")

    class RiskLevel(models.TextChoices):
        LOW = "low", _("پایین")
        MEDIUM = "medium", _("متوسط")
        HIGH = "high", _("بالا")
        CRITICAL = "critical", _("بحرانی")

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    code = models.CharField(_("کد برنامه"), max_length=50, db_index=True)
    name = models.CharField(_("نام"), max_length=300)
    description = models.TextField(_("توضیحات"), blank=True)

    portfolio = models.ForeignKey(
        PortfolioModel, on_delete=models.CASCADE,
        null=True, blank=True, related_name="programs",
        verbose_name=_("پرتفولیو"),
    )

    manager = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.SET_NULL,
        null=True, blank=True, related_name="managed_programs",
        verbose_name=_("مدیر برنامه"),
    )

    status = models.CharField(
        _("وضعیت"), max_length=20,
        choices=Status.choices, default=Status.DRAFT, db_index=True,
    )

    objectives = models.TextField(_("اهداف"), blank=True)
    expected_benefits = models.TextField(_("منافع مورد انتظار"), blank=True)

    budget = models.DecimalField(
        _("بودجه"), max_digits=18, decimal_places=0, default=0,
    )

    start_date = models.DateField(_("تاریخ شروع"), null=True, blank=True)
    end_date = models.DateField(_("تاریخ پایان"), null=True, blank=True)

    risk_level = models.CharField(
        _("سطح ریسک"), max_length=20,
        choices=RiskLevel.choices, default=RiskLevel.MEDIUM,
    )
    progress = models.DecimalField(
        _("درصد پیشرفت"), max_digits=5, decimal_places=2, default=0,
    )

    tags = models.JSONField(_("برچسب‌ها"), default=list, blank=True)
    metadata = models.JSONField(_("متادیتا"), default=dict, blank=True)

    created_at = models.DateTimeField(_("تاریخ ایجاد"), auto_now_add=True)
    updated_at = models.DateTimeField(_("تاریخ بروزرسانی"), auto_now=True)

    class Meta:
        db_table = "ppm_program"
        verbose_name = _("برنامه")
        verbose_name_plural = _("برنامه‌ها")
        ordering = ["-created_at"]
        unique_together = [["tenant", "code"]]

    def __str__(self):
        return f"{self.code} — {self.name}"


# ═══════════════════════════════════════════════════
# 3️⃣ ProgramProject (M2M Link)
# ═══════════════════════════════════════════════════

class ProgramProjectModel(TenantAwareModel):
    """مدل ORM — ارتباط برنامه-پروژه."""

    class Role(models.TextChoices):
        CORE = "core", _("اصلی")
        SUPPORTING = "supporting", _("حمایتی")

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

    program = models.ForeignKey(
        ProgramModel, on_delete=models.CASCADE,
        related_name="program_projects",
        verbose_name=_("برنامه"),
    )
    project_id = models.UUIDField(_("پروژه"), db_index=True)

    role = models.CharField(
        _("نقش"), max_length=20,
        choices=Role.choices, default=Role.CORE,
    )
    priority = models.IntegerField(_("اولویت"), default=0)
    notes = models.TextField(_("یادداشت"), blank=True)

    created_at = models.DateTimeField(_("تاریخ ایجاد"), auto_now_add=True)
    updated_at = models.DateTimeField(_("تاریخ بروزرسانی"), auto_now=True)

    class Meta:
        db_table = "ppm_program_project"
        verbose_name = _("پروژه برنامه")
        verbose_name_plural = _("پروژه‌های برنامه")
        ordering = ["priority", "created_at"]
        unique_together = [["program", "project_id"]]

    def __str__(self):
        return f"Program({self.program_id}) ↔ Project({self.project_id})"


# ═══════════════════════════════════════════════════
# 4️⃣ Business Case
# ═══════════════════════════════════════════════════

class BusinessCaseModel(TenantAwareModel):
    """مدل ORM — کیس تجاری."""

    class Status(models.TextChoices):
        DRAFT = "draft", _("پیش‌نویس")
        SUBMITTED = "submitted", _("ارسال‌شده")
        APPROVED = "approved", _("تأییدشده")
        REJECTED = "rejected", _("ردشده")

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    title = models.CharField(_("عنوان"), max_length=300)
    description = models.TextField(_("توضیحات"), blank=True)

    program = models.ForeignKey(
        ProgramModel, on_delete=models.CASCADE,
        null=True, blank=True, related_name="business_cases",
        verbose_name=_("برنامه"),
    )
    project_id = models.UUIDField(_("پروژه"), null=True, blank=True, db_index=True)

    status = models.CharField(
        _("وضعیت"), max_length=20,
        choices=Status.choices, default=Status.DRAFT, db_index=True,
    )

    sponsor = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.SET_NULL,
        null=True, blank=True, related_name="sponsored_business_cases",
        verbose_name=_("حامی"),
    )
    prepared_by = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.SET_NULL,
        null=True, blank=True, related_name="prepared_business_cases",
        verbose_name=_("تهیه‌کننده"),
    )

    strategic_fit_score = models.DecimalField(
        _("امتیاز تطابق راهبردی"), max_digits=4, decimal_places=2, default=0,
    )

    total_investment = models.DecimalField(
        _("کل سرمایه‌گذاری"), max_digits=18, decimal_places=0, default=0,
    )
    expected_revenue = models.DecimalField(
        _("درآمد مورد انتظار"), max_digits=18, decimal_places=0, default=0,
    )
    expected_savings = models.DecimalField(
        _("صرفه‌جویی مورد انتظار"), max_digits=18, decimal_places=0, default=0,
    )
    payback_period_months = models.IntegerField(_("دوره بازگشت (ماه)"), default=0)

    assumptions = models.TextField(_("مفروضات"), blank=True)
    constraints = models.TextField(_("محدودیت‌ها"), blank=True)
    risks_summary = models.TextField(_("خلاصه ریسک‌ها"), blank=True)

    metadata = models.JSONField(_("متادیتا"), default=dict, blank=True)

    created_at = models.DateTimeField(_("تاریخ ایجاد"), auto_now_add=True)
    updated_at = models.DateTimeField(_("تاریخ بروزرسانی"), auto_now=True)

    class Meta:
        db_table = "ppm_business_case"
        verbose_name = _("کیس تجاری")
        verbose_name_plural = _("کیس‌های تجاری")
        ordering = ["-created_at"]

    def __str__(self):
        return self.title


# ═══════════════════════════════════════════════════
# 5️⃣ Cash Flow Projection
# ═══════════════════════════════════════════════════

class CashFlowProjectionModel(TenantAwareModel):
    """مدل ORM — پیش‌بینی جریان نقدی."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

    business_case = models.ForeignKey(
        BusinessCaseModel, on_delete=models.CASCADE,
        related_name="cash_flows",
        verbose_name=_("کیس تجاری"),
    )

    year = models.IntegerField(_("سال"))
    investment = models.DecimalField(_("سرمایه‌گذاری"), max_digits=18, decimal_places=0, default=0)
    revenue = models.DecimalField(_("درآمد"), max_digits=18, decimal_places=0, default=0)
    savings = models.DecimalField(_("صرفه‌جویی"), max_digits=18, decimal_places=0, default=0)
    operational_cost = models.DecimalField(_("هزینه عملیاتی"), max_digits=18, decimal_places=0, default=0)

    created_at = models.DateTimeField(_("تاریخ ایجاد"), auto_now_add=True)
    updated_at = models.DateTimeField(_("تاریخ بروزرسانی"), auto_now=True)

    class Meta:
        db_table = "ppm_cash_flow_projection"
        verbose_name = _("پیش‌بینی جریان نقدی")
        verbose_name_plural = _("پیش‌بینی‌های جریان نقدی")
        ordering = ["year"]
        unique_together = [["business_case", "year"]]

    def __str__(self):
        return f"سال {self.year} — کیس {self.business_case_id}"


# ═══════════════════════════════════════════════════
# 6️⃣ Scoring Model
# ═══════════════════════════════════════════════════

class ScoringModelModel(TenantAwareModel):
    """مدل ORM — مدل امتیازدهی."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

    name = models.CharField(_("نام"), max_length=300)
    description = models.TextField(_("توضیحات"), blank=True, default="")

    portfolio = models.ForeignKey(
        PortfolioModel, on_delete=models.SET_NULL,
        null=True, blank=True, related_name="scoring_models",
        verbose_name=_("پرتفولیو"),
    )

    is_active = models.BooleanField(_("فعال"), default=True)
    metadata = models.JSONField(_("متادیتا"), default=dict, blank=True)

    created_at = models.DateTimeField(_("تاریخ ایجاد"), auto_now_add=True)
    updated_at = models.DateTimeField(_("تاریخ بروزرسانی"), auto_now=True)

    class Meta:
        db_table = "ppm_scoring_model"
        verbose_name = _("مدل امتیازدهی")
        verbose_name_plural = _("مدل‌های امتیازدهی")
        ordering = ["-created_at"]

    def __str__(self):
        return self.name


# ═══════════════════════════════════════════════════
# 7️⃣ Scoring Criterion
# ═══════════════════════════════════════════════════

class ScoringCriterionModel(TenantAwareModel):
    """مدل ORM — معیار امتیازدهی."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

    class Category(models.TextChoices):
        STRATEGIC = "strategic", _("راهبردی")
        FINANCIAL = "financial", _("مالی")
        RISK = "risk", _("ریسک")
        RESOURCE = "resource", _("منابع")
        TECHNICAL = "technical", _("فنی")
        ORGANIZATIONAL = "organizational", _("سازمانی")

    scoring_model = models.ForeignKey(
        ScoringModelModel, on_delete=models.CASCADE,
        related_name="criteria",
        verbose_name=_("مدل امتیازدهی"),
    )

    name = models.CharField(_("نام"), max_length=300)
    description = models.TextField(_("توضیحات"), blank=True, default="")
    weight = models.DecimalField(_("وزن"), max_digits=5, decimal_places=2, default=0)
    scale_min = models.IntegerField(_("حداقل مقیاس"), default=1)
    scale_max = models.IntegerField(_("حداکثر مقیاس"), default=10)
    category = models.CharField(
        _("دسته‌بندی"), max_length=30,
        choices=Category.choices, default=Category.STRATEGIC,
    )
    order = models.IntegerField(_("ترتیب"), default=0)

    created_at = models.DateTimeField(_("تاریخ ایجاد"), auto_now_add=True)
    updated_at = models.DateTimeField(_("تاریخ بروزرسانی"), auto_now=True)

    class Meta:
        db_table = "ppm_scoring_criterion"
        verbose_name = _("معیار امتیازدهی")
        verbose_name_plural = _("معیارهای امتیازدهی")
        ordering = ["order", "name"]

    def __str__(self):
        return f"{self.name} (وزن: {self.weight})"


# ═══════════════════════════════════════════════════
# 8️⃣ Project Score
# ═══════════════════════════════════════════════════

class ProjectScoreModel(TenantAwareModel):
    """مدل ORM — امتیاز پروژه بر اساس یک معیار."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

    scoring_model = models.ForeignKey(
        ScoringModelModel, on_delete=models.CASCADE,
        related_name="project_scores",
        verbose_name=_("مدل امتیازدهی"),
    )
    project_id = models.UUIDField(_("شناسه پروژه"))
    criterion = models.ForeignKey(
        ScoringCriterionModel, on_delete=models.CASCADE,
        related_name="project_scores",
        verbose_name=_("معیار"),
    )

    score = models.DecimalField(_("امتیاز"), max_digits=5, decimal_places=2, default=0)
    justification = models.TextField(_("توجیه"), blank=True, default="")
    scored_by = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.SET_NULL,
        null=True, blank=True,
        related_name="+",
        verbose_name=_("امتیازدهنده"),
    )
    scored_at = models.DateTimeField(_("تاریخ امتیازدهی"), null=True, blank=True)

    created_at = models.DateTimeField(_("تاریخ ایجاد"), auto_now_add=True)
    updated_at = models.DateTimeField(_("تاریخ بروزرسانی"), auto_now=True)

    class Meta:
        db_table = "ppm_project_score"
        verbose_name = _("امتیاز پروژه")
        verbose_name_plural = _("امتیازات پروژه")
        ordering = ["-created_at"]
        unique_together = [["scoring_model", "project_id", "criterion"]]

    def __str__(self):
        return f"پروژه {self.project_id} — {self.criterion.name}: {self.score}"


# ═══════════════════════════════════════════════════
# 9️⃣ Benefit Plan
# ═══════════════════════════════════════════════════

class BenefitPlanModel(TenantAwareModel):
    """مدل ORM — برنامه تحقق منافع."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(_("نام"), max_length=300)
    description = models.TextField(_("توضیحات"), blank=True, default="")

    program = models.ForeignKey(
        ProgramModel, on_delete=models.CASCADE,
        null=True, blank=True, related_name="benefit_plans",
        verbose_name=_("برنامه"),
    )
    portfolio = models.ForeignKey(
        PortfolioModel, on_delete=models.CASCADE,
        null=True, blank=True, related_name="benefit_plans",
        verbose_name=_("پرتفولیو"),
    )

    is_active = models.BooleanField(_("فعال"), default=True)
    metadata = models.JSONField(_("متادیتا"), default=dict, blank=True)

    created_at = models.DateTimeField(_("تاریخ ایجاد"), auto_now_add=True)
    updated_at = models.DateTimeField(_("تاریخ بروزرسانی"), auto_now=True)

    class Meta:
        db_table = "ppm_benefit_plan"
        verbose_name = _("برنامه تحقق منافع")
        verbose_name_plural = _("برنامه‌های تحقق منافع")
        ordering = ["-created_at"]

    def __str__(self):
        return self.name


# ═══════════════════════════════════════════════════
# 🔟 Benefit
# ═══════════════════════════════════════════════════

class BenefitModel(TenantAwareModel):
    """مدل ORM — منفعت."""

    class BenefitType(models.TextChoices):
        FINANCIAL = "financial", _("مالی")
        NON_FINANCIAL = "non_financial", _("غیرمالی")

    class Status(models.TextChoices):
        IDENTIFIED = "identified", _("شناسایی‌شده")
        PLANNED = "planned", _("برنامه‌ریزی‌شده")
        REALIZED = "realized", _("تحقق‌یافته")
        FAILED = "failed", _("ناموفق")

    class Frequency(models.TextChoices):
        WEEKLY = "weekly", _("هفتگی")
        MONTHLY = "monthly", _("ماهانه")
        QUARTERLY = "quarterly", _("سه‌ماهه")
        YEARLY = "yearly", _("سالانه")

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

    benefit_plan = models.ForeignKey(
        BenefitPlanModel, on_delete=models.CASCADE,
        related_name="benefits",
        verbose_name=_("برنامه تحقق منافع"),
    )

    title = models.CharField(_("عنوان"), max_length=300)
    description = models.TextField(_("توضیحات"), blank=True, default="")

    benefit_type = models.CharField(
        _("نوع منفعت"), max_length=20,
        choices=BenefitType.choices, default=BenefitType.FINANCIAL,
    )
    category = models.CharField(_("دسته‌بندی"), max_length=100, blank=True, default="")

    target_value = models.DecimalField(
        _("مقدار هدف"), max_digits=18, decimal_places=2, default=0,
    )
    actual_value = models.DecimalField(
        _("مقدار واقعی"), max_digits=18, decimal_places=2, default=0,
    )
    measurement_method = models.TextField(_("روش اندازه‌گیری"), blank=True, default="")
    frequency = models.CharField(
        _("فرکانس اندازه‌گیری"), max_length=20,
        choices=Frequency.choices, default=Frequency.QUARTERLY,
    )

    owner = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.SET_NULL,
        null=True, blank=True, related_name="+",
        verbose_name=_("مسئول"),
    )

    status = models.CharField(
        _("وضعیت"), max_length=20,
        choices=Status.choices, default=Status.IDENTIFIED, db_index=True,
    )

    target_date = models.DateField(_("تاریخ هدف"), null=True, blank=True)

    metadata = models.JSONField(_("متادیتا"), default=dict, blank=True)

    created_at = models.DateTimeField(_("تاریخ ایجاد"), auto_now_add=True)
    updated_at = models.DateTimeField(_("تاریخ بروزرسانی"), auto_now=True)

    class Meta:
        db_table = "ppm_benefit"
        verbose_name = _("منفعت")
        verbose_name_plural = _("منافع")
        ordering = ["-created_at"]

    def __str__(self):
        return self.title


# ═══════════════════════════════════════════════════
# 1️⃣1️⃣ Benefit Measurement
# ═══════════════════════════════════════════════════

class BenefitMeasurementModel(TenantAwareModel):
    """مدل ORM — اندازه‌گیری منفعت."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

    benefit = models.ForeignKey(
        BenefitModel, on_delete=models.CASCADE,
        related_name="measurements",
        verbose_name=_("منفعت"),
    )

    measurement_date = models.DateField(_("تاریخ اندازه‌گیری"), null=True, blank=True)
    value = models.DecimalField(
        _("مقدار"), max_digits=18, decimal_places=2, default=0,
    )
    notes = models.TextField(_("یادداشت"), blank=True, default="")

    measured_by = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.SET_NULL,
        null=True, blank=True, related_name="+",
        verbose_name=_("اندازه‌گیری‌کننده"),
    )

    created_at = models.DateTimeField(_("تاریخ ایجاد"), auto_now_add=True)
    updated_at = models.DateTimeField(_("تاریخ بروزرسانی"), auto_now=True)

    class Meta:
        db_table = "ppm_benefit_measurement"
        verbose_name = _("اندازه‌گیری منفعت")
        verbose_name_plural = _("اندازه‌گیری‌های منفعت")
        ordering = ["-measurement_date", "-created_at"]

    def __str__(self):
        return f"{self.benefit.title} — {self.measurement_date}: {self.value}"


# ═══════════════════════════════════════════════════
# 1️⃣2️⃣ Capacity Plan
# ═══════════════════════════════════════════════════

class CapacityPlanModel(TenantAwareModel):
    """مدل ORM — برنامه ظرفیت."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(_("نام"), max_length=300)
    description = models.TextField(_("توضیحات"), blank=True, default="")

    portfolio = models.ForeignKey(
        PortfolioModel, on_delete=models.CASCADE,
        null=True, blank=True, related_name="capacity_plans",
        verbose_name=_("پرتفولیو"),
    )

    period_start = models.DateField(_("شروع دوره"), null=True, blank=True)
    period_end = models.DateField(_("پایان دوره"), null=True, blank=True)

    is_active = models.BooleanField(_("فعال"), default=True)
    metadata = models.JSONField(_("متادیتا"), default=dict, blank=True)

    created_at = models.DateTimeField(_("تاریخ ایجاد"), auto_now_add=True)
    updated_at = models.DateTimeField(_("تاریخ بروزرسانی"), auto_now=True)

    class Meta:
        db_table = "ppm_capacity_plan"
        verbose_name = _("برنامه ظرفیت")
        verbose_name_plural = _("برنامه‌های ظرفیت")
        ordering = ["-created_at"]

    def __str__(self):
        return self.name


# ═══════════════════════════════════════════════════
# 1️⃣3️⃣ Resource Demand
# ═══════════════════════════════════════════════════

class ResourceDemandModel(TenantAwareModel):
    """مدل ORM — تقاضای منابع."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

    capacity_plan = models.ForeignKey(
        CapacityPlanModel, on_delete=models.CASCADE,
        related_name="demands",
        verbose_name=_("برنامه ظرفیت"),
    )

    resource_type = models.CharField(_("نوع منبع / مهارت"), max_length=200)
    project_id = models.UUIDField(_("پروژه"), null=True, blank=True, db_index=True)

    demand_hours = models.DecimalField(
        _("ساعات تقاضا"), max_digits=10, decimal_places=2, default=0,
    )
    period = models.CharField(_("دوره"), max_length=50)

    notes = models.TextField(_("یادداشت"), blank=True, default="")

    created_at = models.DateTimeField(_("تاریخ ایجاد"), auto_now_add=True)
    updated_at = models.DateTimeField(_("تاریخ بروزرسانی"), auto_now=True)

    class Meta:
        db_table = "ppm_resource_demand"
        verbose_name = _("تقاضای منابع")
        verbose_name_plural = _("تقاضای منابع")
        ordering = ["period", "resource_type"]

    def __str__(self):
        return f"{self.resource_type} — {self.period}: {self.demand_hours}h"


# ═══════════════════════════════════════════════════
# 1️⃣4️⃣ Resource Supply
# ═══════════════════════════════════════════════════

class ResourceSupplyModel(TenantAwareModel):
    """مدل ORM — عرضه منابع."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

    capacity_plan = models.ForeignKey(
        CapacityPlanModel, on_delete=models.CASCADE,
        related_name="supplies",
        verbose_name=_("برنامه ظرفیت"),
    )

    resource_type = models.CharField(_("نوع منبع / مهارت"), max_length=200)

    available_hours = models.DecimalField(
        _("ساعات در دسترس"), max_digits=10, decimal_places=2, default=0,
    )
    period = models.CharField(_("دوره"), max_length=50)

    notes = models.TextField(_("یادداشت"), blank=True, default="")

    created_at = models.DateTimeField(_("تاریخ ایجاد"), auto_now_add=True)
    updated_at = models.DateTimeField(_("تاریخ بروزرسانی"), auto_now=True)

    class Meta:
        db_table = "ppm_resource_supply"
        verbose_name = _("عرضه منابع")
        verbose_name_plural = _("عرضه منابع")
        ordering = ["period", "resource_type"]

    def __str__(self):
        return f"{self.resource_type} — {self.period}: {self.available_hours}h"


# ═══════════════════════════════════════════════════
# 1️⃣5️⃣ Cross-Project Dependency
# ═══════════════════════════════════════════════════

class CrossProjectDependencyModel(TenantAwareModel):
    """مدل ORM — وابستگی بین پروژه‌ای."""

    class DependencyType(models.TextChoices):
        FS = "FS", _("پایان-به-شروع")
        SS = "SS", _("شروع-به-شروع")
        FF = "FF", _("پایان-به-پایان")
        SF = "SF", _("شروع-به-پایان")

    class Status(models.TextChoices):
        ACTIVE = "active", _("فعال")
        RESOLVED = "resolved", _("حل‌شده")

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

    predecessor_project_id = models.UUIDField(
        _("شناسه پروژه پیش‌نیاز"), null=True, blank=True,
    )
    successor_project_id = models.UUIDField(
        _("شناسه پروژه وابسته"), null=True, blank=True,
    )
    predecessor_milestone_id = models.UUIDField(
        _("شناسه مایلستون پیش‌نیاز"), null=True, blank=True,
    )
    successor_milestone_id = models.UUIDField(
        _("شناسه مایلستون وابسته"), null=True, blank=True,
    )

    dependency_type = models.CharField(
        _("نوع وابستگی"), max_length=2,
        choices=DependencyType.choices, default=DependencyType.FS,
    )
    lag_days = models.IntegerField(_("تأخیر (روز)"), default=0)
    status = models.CharField(
        _("وضعیت"), max_length=20,
        choices=Status.choices, default=Status.ACTIVE,
    )
    impact_description = models.TextField(_("توضیح تأثیر"), blank=True, default="")

    metadata = models.JSONField(_("متادیتا"), default=dict, blank=True)

    created_at = models.DateTimeField(_("تاریخ ایجاد"), auto_now_add=True)
    updated_at = models.DateTimeField(_("تاریخ بروزرسانی"), auto_now=True)

    class Meta:
        db_table = "ppm_cross_project_dependency"
        verbose_name = _("وابستگی بین پروژه‌ای")
        verbose_name_plural = _("وابستگی‌های بین پروژه‌ای")
        ordering = ["-created_at"]

    def __str__(self):
        return f"{self.predecessor_project_id} → {self.successor_project_id} ({self.dependency_type})"


# ═══════════════════════════════════════════════════
# 9️⃣ PPM Document Link
# ═══════════════════════════════════════════════════

class PPMDocumentModel(TenantAwareModel):
    """
    جدول پیوند اسناد PPM با ماژول مدیریت اسناد.
    مانند ProjectDocumentModel ماژول PM — ذخیره UUID سند از سرویس Document Control.
    """

    class EntityType(models.TextChoices):
        PORTFOLIO = "portfolio", _("پرتفولیو")
        PROGRAM = "program", _("برنامه")
        BUSINESS_CASE = "business_case", _("کیس تجاری")
        BENEFIT_PLAN = "benefit_plan", _("طرح منافع")
        CAPACITY_PLAN = "capacity_plan", _("طرح ظرفیت")

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

    entity_type = models.CharField(
        _("نوع موجودیت"), max_length=30,
        choices=EntityType.choices,
    )
    entity_id = models.UUIDField(
        _("شناسه موجودیت"), db_index=True,
        help_text=_("شناسه پرتفولیو، برنامه یا کیس تجاری"),
    )

    # UUID reference to Document Control service (no FK)
    document_id = models.UUIDField(
        _("شناسه سند"), db_index=True,
        help_text=_("ارجاع به سند در سرویس مدیریت اسناد"),
    )

    title = models.CharField(
        _("عنوان سند"), max_length=500,
        help_text=_("عنوان کپی‌شده از سرویس اسناد برای نمایش سریع"),
    )
    document_code = models.CharField(
        _("کد سند"), max_length=100, blank=True, default="",
    )
    linked_by = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.SET_NULL,
        null=True, blank=True,
        verbose_name=_("پیوندشده توسط"),
        related_name="+",
    )
    notes = models.TextField(_("یادداشت"), blank=True, default="")

    created_at = models.DateTimeField(_("تاریخ ایجاد"), auto_now_add=True)
    updated_at = models.DateTimeField(_("تاریخ بروزرسانی"), auto_now=True)

    class Meta:
        db_table = "ppm_document"
        verbose_name = _("سند PPM")
        verbose_name_plural = _("اسناد PPM")
        ordering = ["-created_at"]
        unique_together = [("entity_type", "entity_id", "document_id")]

    def __str__(self):
        return f"{self.entity_type}:{self.entity_id} → {self.document_id}"
