"""
Inventory API Permissions — v1.

مجوزهای دسترسی ماژول انبار.

NOTE: Uses PermissionService from the platform's custom RBAC system
instead of Django's built-in has_perm() which only checks auth_permission table.
"""
from rest_framework.permissions import BasePermission

from apps.core.permission.services import PermissionService


class InventoryBasePermission(BasePermission):
    """
    مجوز پایه ماژول انبار.

    Subclasses must define `module` and `resource` attributes.
    """
    module = "inventory"
    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
        if not self.resource:
            return True

        prefix = f"{self.module}.{self.resource}"
        if request.method in ("GET", "HEAD", "OPTIONS"):
            return PermissionService.has_any_permission(
                request.user,
                [f"{prefix}.list", f"{prefix}.read"],
            )
        return PermissionService.has_any_permission(
            request.user,
            [f"{prefix}.create", f"{prefix}.update", f"{prefix}.delete", f"{prefix}.manage"],
        )


class CanManageMasterData(InventoryBasePermission):
    """مجوز مدیریت داده‌های پایه (کالا، گروه، واحد، نوع)."""
    resource = "item"


class CanManageWarehouse(InventoryBasePermission):
    """مجوز مدیریت انبار و مکان‌ها."""
    resource = "warehouse"


class CanManageStock(InventoryBasePermission):
    """مجوز ثبت حرکات موجودی (رسید، حواله، انتقال، تعدیل)."""
    resource = "stock"


class CanManageBatchSerial(InventoryBasePermission):
    """مجوز مدیریت بچ و سریال."""
    resource = "batch"


class CanManageReservation(InventoryBasePermission):
    """مجوز مدیریت رزرو."""
    resource = "reservation"


class CanManagePhysicalInventory(InventoryBasePermission):
    """مجوز مدیریت شمارش فیزیکی."""
    resource = "physical_inventory"


class CanManageQuality(InventoryBasePermission):
    """مجوز مدیریت کنترل کیفیت."""
    resource = "quality"


class CanManageCosting(InventoryBasePermission):
    """مجوز مدیریت قیمت‌گذاری."""
    resource = "costing"
