from typing import Dict, List, Any


def get_role_based_permissions(role: str) -> Dict[str, Any]:
    role_permissions_map = {
        'user': {
            "auth": {"logout": ["logout"]},
            "users": {"user": ["retrieve", "update"]},
            "leaderboard": {"leaderboard": ["list"]},
            "bonus": {"bonus": ["list"]},
            "package": {"package": ["list", "retrieve", "subscribe", "user_packages"]},
            "level": {"level": ["list"]},
            "downline": {"downline": ["my_downline", "level", "stats", "earning_report"]},
            "profile": {
                "profile": [
                    "claim_referral", 
                    "me", 
                    "update", 
                    "payment_create", 
                    "payment_verify",
                    "my_subscriptions", 
                    "available_ranks",
                    "claim_rank", 
                    "rankings", 
                    "global_ranking_list", 
                    "category_ranking_list",
                    "rank_categories",           
                    "category_ranking",           
                    "rank_category_detail",        
                    "global_rank",                  
                    "rank_progress"                 
                ]
            },
            "withdraw": {"withdraw": ["list", "create"]},
            "deposit": {"deposit": ["list", "create", "retrieve", "verify_payment"]},
            "pymentMethod": {"pymentMethod": ["list", "retrieve"]},
            "testimonial": {"testimonial": ["list"]},
            "tranfer": {"tranfer": ["list", "create", "update", "partial_update", "retrieve", "destroy", "toggle_status"]},
        },
        'admin': {
            "auth": {"logout": ["logout"]},
            "users": {
                "user": ["list", "create", "update", "partial_update", "retrieve", "destroy", "manage_permissions", "toggle_status", "change_role"]
            },
            "permissions": {"permissions": ["list"]},
            "leaderboard": {"leaderboard": ["list"]},
            "bonus": {"bonus": ["list", "create", "update", "partial_update", "retrieve", "destroy", "toggle_status"]},
            "package": {"package": ["list", "create", "update", "partial_update", "retrieve", "destroy", "subscribe", "unsubscribe", "toggle_status"]},
            "level": {"level": ["list", "retrieve", "create", "update", "destroy", "partial_update", "initialize_levels", "toggle_status"]},
            "downline": {"downline": ["my_downline", "level", "stats", "earning_report"]},
            "profile": {
                "profile": [
                    "list",                       
                    "retrieve",                    
                    "update",                      
                    "toggle_status",               
                    "destroy",                     
                    "update_balance",                
                    "partial_update",               
                    "claim_referral",                
                    "me",                           
                    "user_details",                 
                    "payment_create",                
                    "payment_verify",                
                    "claim_rank",                    
                    "global_rank",                     
                    "rank_categories",                  
                    "category_ranking",                 
                    "rank_category_detail",
                    "rank_progress"
                ]
            },
            "withdraw": {"withdraw": ["list", "create", "retrieve", "update", "toggle_status", "destroy", "partial_update", "approve", "reject"]},
            "deposit": {"deposit": ["list", "create", "update", "toggle_status", "partial_update", "retrieve", "destroy", "verify_payment"]},
            "pymentMethod": {"pymentMethod": ["list", "create", "retrieve", "update", "toggle_status", "destroy", "partial_update"]},
            "testimonial": {"testimonial": ["list", "create", "retrieve", "update", "toggle_status", "destroy", "partial_update"]},
            "tranfer": {"tranfer": ["list", "create", "update", "partial_update", "retrieve", "destroy", "toggle_status"]},
        }
    }
    
    role_key = str(role).lower() if role else 'user'
    return role_permissions_map.get(role_key, role_permissions_map['user'])


def merge_permissions(current_perms: Dict, new_perms: Dict) -> Dict:
    if not current_perms:
        return new_perms.copy() if new_perms else {}
    
    result = current_perms.copy()
    
    for app, models in new_perms.items():
        if app not in result:
            result[app] = {}
        
        for model, actions in models.items():
            if model not in result[app]:
                result[app][model] = []
            
            existing_actions = set(result[app][model])
            new_actions = set(actions)
            result[app][model] = list(existing_actions.union(new_actions))
    
    return result


def validate_permissions_structure(permissions: Dict) -> bool:
    """
    Permission structure validate করে
    """
    if permissions is None:
        return True
    
    if not isinstance(permissions, dict):
        return False
    
    for app, models in permissions.items():
        if not isinstance(models, dict):
            return False
        
        for model, actions in models.items():
            if not isinstance(actions, list):
                return False
            
            # Check if all actions are strings
            if not all(isinstance(action, str) for action in actions):
                return False
    
    return True


def get_allowed_actions_for_role(role: str, app: str, model: str) -> List[str]:
    role_perms = get_role_based_permissions(role)
    return role_perms.get(app, {}).get(model, [])