from enum import StrEnum


class Role(StrEnum):
    CEO = "CEO"
    ADMIN = "ADMIN"
    MANAGER = "MANAGER"
    CASHIER = "CASHIER"
    STOREKEEPER = "STOREKEEPER"
    ACCOUNTANT = "ACCOUNTANT"


class Permission(StrEnum):
    MANAGE_STAFF = "manage_staff"
    MANAGE_CEO = "manage_ceo"
    OPERATE_SALES = "operate_sales"
    MANAGE_INVENTORY = "manage_inventory"
    MANAGE_FINANCES = "manage_finances"
    PROCESS_PAYROLL = "process_payroll"
    APPROVE_PAYROLL = "approve_payroll"
    MANAGE_PAYROLL_PROFILES = "manage_payroll_profiles"
    PAY_PAYROLL = "pay_payroll"
    VIEW_LOYALTY = "view_loyalty"
    OPERATE_LOYALTY = "operate_loyalty"
    MANAGE_LOYALTY = "manage_loyalty"


ROLE_PERMISSIONS = {
    Role.CEO: frozenset(Permission),
    Role.ADMIN: frozenset({Permission.MANAGE_STAFF, Permission.OPERATE_SALES, Permission.MANAGE_INVENTORY, Permission.MANAGE_FINANCES, Permission.PROCESS_PAYROLL, Permission.MANAGE_PAYROLL_PROFILES, Permission.VIEW_LOYALTY, Permission.OPERATE_LOYALTY, Permission.MANAGE_LOYALTY}),
    Role.MANAGER: frozenset({Permission.OPERATE_SALES, Permission.MANAGE_INVENTORY, Permission.VIEW_LOYALTY, Permission.OPERATE_LOYALTY, Permission.MANAGE_LOYALTY}),
    Role.CASHIER: frozenset({Permission.OPERATE_SALES, Permission.VIEW_LOYALTY, Permission.OPERATE_LOYALTY}),
    Role.STOREKEEPER: frozenset({Permission.MANAGE_INVENTORY}),
    Role.ACCOUNTANT: frozenset({Permission.MANAGE_FINANCES, Permission.PROCESS_PAYROLL, Permission.MANAGE_PAYROLL_PROFILES, Permission.VIEW_LOYALTY}),
}


def normalize_role(value: str) -> Role | None:
    try:
        return Role(value.strip().upper())
    except (AttributeError, ValueError):
        return None


def has_permission(role: str, permission: Permission) -> bool:
    normalized = normalize_role(role)
    return normalized is not None and permission in ROLE_PERMISSIONS[normalized]
