"""
PPM API v1 — Permissions

کلاس‌های مجوز ماژول مدیریت پرتفولیو و برنامه.
"""
from rest_framework.permissions import BasePermission


class PPMBasePermission(BasePermission):
    """Base permission for PPM module."""
    resource = ""

    def has_permission(self, request, view):
        if not request.user or not request.user.is_authenticated:
            return False
        if request.user.is_superuser:
            return True

        action_map = {
            "list": "list",
            "retrieve": "read",
            "create": "create",
            "update": "update",
            "partial_update": "update",
            "destroy": "delete",
        }
        action = action_map.get(view.action, view.action)
        perm = f"ppm.{self.resource}.{action}"
        return request.user.has_perm(perm)


class PortfolioPermission(PPMBasePermission):
    resource = "portfolio"


class ProgramPermission(PPMBasePermission):
    resource = "program"


class ProgramProjectPermission(PPMBasePermission):
    resource = "program_project"


class BusinessCasePermission(PPMBasePermission):
    resource = "business_case"


class CashFlowPermission(PPMBasePermission):
    resource = "cash_flow"


class ScoringModelPermission(PPMBasePermission):
    resource = "scoring_model"


class ScoringCriterionPermission(PPMBasePermission):
    resource = "scoring_criterion"


class ProjectScorePermission(PPMBasePermission):
    resource = "project_score"


class BenefitPlanPermission(PPMBasePermission):
    resource = "benefit_plan"


class BenefitPermission(PPMBasePermission):
    resource = "benefit"


class BenefitMeasurementPermission(PPMBasePermission):
    resource = "benefit_measurement"


class CapacityPlanPermission(PPMBasePermission):
    resource = "capacity_plan"


class ResourceDemandPermission(PPMBasePermission):
    resource = "resource_demand"


class ResourceSupplyPermission(PPMBasePermission):
    resource = "resource_supply"


class CrossProjectDependencyPermission(PPMBasePermission):
    resource = "cross_project_dependency"


class PPMDocumentPermission(PPMBasePermission):
    resource = "ppm_document"
