from __future__ import annotations

from enum import StrEnum


class AdminCap(StrEnum):
    MERCHANTS_VIEW_ALL = "admin:merchants.view_all"
    MERCHANTS_MANAGE = "admin:merchants.manage"
    MERCHANTS_IMPERSONATE = "admin:merchants.impersonate"
    USERS_VIEW = "admin:users.view"
    USERS_MANAGE = "admin:users.manage"
    USERS_MANAGE_AGENTS = "admin:users.manage_agents"
    TRANSACTIONS_VIEW = "admin:transactions.view"
    TRANSACTIONS_REFUND = "admin:transactions.refund"
    INVOICES_VIEW = "admin:invoices.view"
    REPORTS_VIEW = "admin:reports.view"
    PROVIDERS_MANAGE = "admin:providers.manage"
    TEMPLATES_MANAGE = "admin:templates.manage"
    AUDIT_LOG_VIEW = "admin:audit_log.view"
    SETTINGS_MANAGE = "admin:settings.manage"
    SCHEDULERS_READ = "admin:schedulers.read"
    SCHEDULERS_MANAGE = "admin:schedulers.manage"


ROLE_CAPABILITIES: dict[str, set[AdminCap]] = {
    "admin": {
        AdminCap.MERCHANTS_VIEW_ALL,
        AdminCap.MERCHANTS_MANAGE,
        AdminCap.MERCHANTS_IMPERSONATE,
        AdminCap.USERS_VIEW,
        AdminCap.USERS_MANAGE,
        AdminCap.USERS_MANAGE_AGENTS,
        AdminCap.TRANSACTIONS_VIEW,
        AdminCap.TRANSACTIONS_REFUND,
        AdminCap.INVOICES_VIEW,
        AdminCap.REPORTS_VIEW,
        AdminCap.PROVIDERS_MANAGE,
        AdminCap.TEMPLATES_MANAGE,
        AdminCap.AUDIT_LOG_VIEW,
        AdminCap.SETTINGS_MANAGE,
        AdminCap.SCHEDULERS_READ,
        AdminCap.SCHEDULERS_MANAGE,
    },
    "staff": {
        AdminCap.MERCHANTS_VIEW_ALL,
        AdminCap.TRANSACTIONS_VIEW,
        AdminCap.INVOICES_VIEW,
        AdminCap.REPORTS_VIEW,
    },
    "customer_support": {
        AdminCap.MERCHANTS_VIEW_ALL,
        AdminCap.TRANSACTIONS_VIEW,
        AdminCap.TRANSACTIONS_REFUND,
        AdminCap.INVOICES_VIEW,
    },
    "agent": {
        # No MERCHANTS_VIEW_ALL — merchant list filtered by assignment
        AdminCap.TRANSACTIONS_VIEW,
        AdminCap.TRANSACTIONS_REFUND,
        AdminCap.INVOICES_VIEW,
    },
}


def get_role_capabilities(role_slug: str) -> set[AdminCap]:
    return ROLE_CAPABILITIES.get(role_slug, set())
