"""
Permission Constants

Standard permissions and roles for the platform.
"""

from enum import Enum
from typing import Dict, List, Set


class PERMISSIONS:
    """Standard Permission Identifiers."""
    
    # User Management
    USER_VIEW = "user:view"
    USER_CREATE = "user:create"
    USER_UPDATE = "user:update"
    USER_DELETE = "user:delete"
    USER_MANAGE = "user:manage"
    
    # Role Management
    ROLE_VIEW = "role:view"
    ROLE_CREATE = "role:create"
    ROLE_UPDATE = "role:update"
    ROLE_DELETE = "role:delete"
    ROLE_ASSIGN = "role:assign"
    
    # Tenant Management
    TENANT_VIEW = "tenant:view"
    TENANT_CREATE = "tenant:create"
    TENANT_UPDATE = "tenant:update"
    TENANT_DELETE = "tenant:delete"
    TENANT_MANAGE = "tenant:manage"
    
    # Worktable
    TABLE_VIEW = "table:view"
    TABLE_CREATE = "table:create"
    TABLE_UPDATE = "table:update"
    TABLE_DELETE = "table:delete"
    TABLE_MANAGE = "table:manage"
    
    # Records
    RECORD_VIEW = "record:view"
    RECORD_CREATE = "record:create"
    RECORD_UPDATE = "record:update"
    RECORD_DELETE = "record:delete"
    RECORD_EXPORT = "record:export"
    RECORD_IMPORT = "record:import"
    
    # Workflow
    WORKFLOW_VIEW = "workflow:view"
    WORKFLOW_CREATE = "workflow:create"
    WORKFLOW_UPDATE = "workflow:update"
    WORKFLOW_DELETE = "workflow:delete"
    WORKFLOW_EXECUTE = "workflow:execute"
    
    # Audit
    AUDIT_VIEW = "audit:view"
    AUDIT_EXPORT = "audit:export"
    
    # Settings
    SETTINGS_VIEW = "settings:view"
    SETTINGS_UPDATE = "settings:update"
    
    # API
    API_ACCESS = "api:access"
    API_MANAGE = "api:manage"


class ROLES:
    """Standard Role Identifiers."""
    
    # System Roles
    SUPER_ADMIN = "super_admin"
    SYSTEM_ADMIN = "system_admin"
    
    # Tenant Roles
    TENANT_OWNER = "tenant_owner"
    TENANT_ADMIN = "tenant_admin"
    TENANT_MANAGER = "tenant_manager"
    TENANT_MEMBER = "tenant_member"
    TENANT_VIEWER = "tenant_viewer"
    TENANT_GUEST = "tenant_guest"
    
    # Application Roles
    APP_ADMIN = "app_admin"
    APP_EDITOR = "app_editor"
    APP_VIEWER = "app_viewer"


# Role Permission Mappings
ROLE_PERMISSIONS: Dict[str, List[str]] = {
    ROLES.SUPER_ADMIN: ["*"],  # All permissions
    
    ROLES.TENANT_OWNER: [
        PERMISSIONS.USER_MANAGE,
        PERMISSIONS.ROLE_MANAGE if hasattr(PERMISSIONS, 'ROLE_MANAGE') else PERMISSIONS.ROLE_ASSIGN,
        PERMISSIONS.TENANT_MANAGE,
        PERMISSIONS.TABLE_MANAGE,
        PERMISSIONS.RECORD_VIEW,
        PERMISSIONS.RECORD_CREATE,
        PERMISSIONS.RECORD_UPDATE,
        PERMISSIONS.RECORD_DELETE,
        PERMISSIONS.RECORD_EXPORT,
        PERMISSIONS.RECORD_IMPORT,
        PERMISSIONS.WORKFLOW_MANAGE if hasattr(PERMISSIONS, 'WORKFLOW_MANAGE') else PERMISSIONS.WORKFLOW_CREATE,
        PERMISSIONS.AUDIT_VIEW,
        PERMISSIONS.SETTINGS_UPDATE,
        PERMISSIONS.API_MANAGE,
    ],
    
    ROLES.TENANT_ADMIN: [
        PERMISSIONS.USER_VIEW,
        PERMISSIONS.USER_CREATE,
        PERMISSIONS.USER_UPDATE,
        PERMISSIONS.ROLE_VIEW,
        PERMISSIONS.ROLE_ASSIGN,
        PERMISSIONS.TABLE_VIEW,
        PERMISSIONS.TABLE_CREATE,
        PERMISSIONS.TABLE_UPDATE,
        PERMISSIONS.RECORD_VIEW,
        PERMISSIONS.RECORD_CREATE,
        PERMISSIONS.RECORD_UPDATE,
        PERMISSIONS.RECORD_DELETE,
        PERMISSIONS.RECORD_EXPORT,
        PERMISSIONS.WORKFLOW_VIEW,
        PERMISSIONS.WORKFLOW_CREATE,
        PERMISSIONS.WORKFLOW_EXECUTE,
        PERMISSIONS.AUDIT_VIEW,
        PERMISSIONS.SETTINGS_VIEW,
        PERMISSIONS.API_ACCESS,
    ],
    
    ROLES.TENANT_MEMBER: [
        PERMISSIONS.USER_VIEW,
        PERMISSIONS.TABLE_VIEW,
        PERMISSIONS.RECORD_VIEW,
        PERMISSIONS.RECORD_CREATE,
        PERMISSIONS.RECORD_UPDATE,
        PERMISSIONS.WORKFLOW_VIEW,
        PERMISSIONS.WORKFLOW_EXECUTE,
        PERMISSIONS.API_ACCESS,
    ],
    
    ROLES.TENANT_VIEWER: [
        PERMISSIONS.TABLE_VIEW,
        PERMISSIONS.RECORD_VIEW,
        PERMISSIONS.WORKFLOW_VIEW,
    ],
}
