from django.core.management.base import BaseCommand
from django.db import transaction
from users.models import RolePermission, DefaultRolePermission


class Command(BaseCommand):
    help = 'Set up simplified permissions system with core modules and actions'

    def handle(self, *args, **options):
        self.stdout.write(self.style.SUCCESS('Setting up simplified permissions system...'))
        
        # Define the simplified permission structure
        MODULES = [
            'dashboard',
            'clients', 
            'loans',
            'repayments',
            'portfolio',
            'reports_and_statements',
            'documents',
            'customer_documents',
            'payment_receipts',
            'notifications',
            'settings',
            'branch_settings',
            'system_settings'
        ]
        
        ACTIONS = [
            'access', 'create', 'edit', 'delete', 'approve', 'reject', 'verify', 'validate',
            'export', 'import', 'download', 'upload', 'print', 'process', 'calculate',
            'generate', 'record', 'reconcile', 'assign', 'reassign', 'manage', 'configure',
            'send', 'email', 'notify', 'share', 'activate', 'deactivate', 'suspend',
            'close', 'monitor', 'audit', 'backup', 'restore'
        ]
        
        ROLES = [
            'admin',
            'team_leader', 
            'loan_officer',
            'secretary',
            'auditor',
            'borrower'
        ]
        
        # Define default permissions for each role
        DEFAULT_PERMISSIONS = {
            'admin': {
                # Admin has all permissions
                module: {action: True for action in ACTIONS}
                for module in MODULES
            },
            'team_leader': {
                'dashboard': {
                    'access': True, 'create': True, 'edit': True, 'delete': False, 'approve': True,
                    'reject': True, 'verify': True, 'validate': True, 'export': True, 'import': True,
                    'download': True, 'upload': True, 'print': True, 'process': True, 'calculate': True,
                    'generate': True, 'record': True, 'reconcile': True, 'assign': True, 'reassign': True,
                    'manage': True, 'configure': False, 'send': True, 'email': True, 'notify': True,
                    'share': True, 'activate': False, 'deactivate': False, 'suspend': False, 'close': True,
                    'monitor': True, 'audit': True, 'backup': False, 'restore': False
                },
                'clients': {
                    'access': True, 'create': True, 'edit': True, 'delete': False, 'approve': True,
                    'reject': True, 'verify': True, 'validate': True, 'export': True, 'import': True,
                    'download': True, 'upload': True, 'print': True, 'process': True, 'calculate': True,
                    'generate': True, 'record': True, 'reconcile': True, 'assign': True, 'reassign': True,
                    'manage': True, 'configure': False, 'send': True, 'email': True, 'notify': True,
                    'share': True, 'activate': True, 'deactivate': True, 'suspend': True, 'close': True,
                    'monitor': True, 'audit': True, 'backup': False, 'restore': False
                },
                'loans': {
                    'access': True, 'create': True, 'edit': True, 'delete': False, 'approve': True,
                    'reject': True, 'verify': True, 'validate': True, 'export': True, 'import': True,
                    'download': True, 'upload': True, 'print': True, 'process': True, 'calculate': True,
                    'generate': True, 'record': True, 'reconcile': True, 'assign': True, 'reassign': True,
                    'manage': True, 'configure': False, 'send': True, 'email': True, 'notify': True,
                    'share': True, 'activate': True, 'deactivate': True, 'suspend': True, 'close': True,
                    'monitor': True, 'audit': True, 'backup': False, 'restore': False
                },
                'repayments': {
                    'access': True, 'create': True, 'edit': True, 'delete': False, 'approve': True,
                    'reject': True, 'verify': True, 'validate': True, 'export': True, 'import': True,
                    'download': True, 'upload': True, 'print': True, 'process': True, 'calculate': True,
                    'generate': True, 'record': True, 'reconcile': True, 'assign': True, 'reassign': True,
                    'manage': True, 'configure': False, 'send': True, 'email': True, 'notify': True,
                    'share': True, 'activate': False, 'deactivate': False, 'suspend': False, 'close': True,
                    'monitor': True, 'audit': True, 'backup': False, 'restore': False
                },
                'portfolio': {
                    'access': True, 'create': True, 'edit': True, 'delete': False, 'approve': True,
                    'reject': True, 'verify': True, 'validate': True, 'export': True, 'import': True,
                    'download': True, 'upload': True, 'print': True, 'process': True, 'calculate': True,
                    'generate': True, 'record': True, 'reconcile': True, 'assign': True, 'reassign': True,
                    'manage': True, 'configure': False, 'send': True, 'email': True, 'notify': True,
                    'share': True, 'activate': False, 'deactivate': False, 'suspend': False, 'close': False,
                    'monitor': True, 'audit': True, 'backup': False, 'restore': False
                },
                'reports_and_statements': {
                    'access': True, 'create': True, 'edit': True, 'delete': False, 'approve': True,
                    'reject': False, 'verify': True, 'validate': True, 'export': True, 'import': False,
                    'download': True, 'upload': False, 'print': True, 'process': True, 'calculate': True,
                    'generate': True, 'record': False, 'reconcile': False, 'assign': False, 'reassign': False,
                    'manage': True, 'configure': False, 'send': True, 'email': True, 'notify': True,
                    'share': True, 'activate': False, 'deactivate': False, 'suspend': False, 'close': False,
                    'monitor': True, 'audit': True, 'backup': False, 'restore': False
                },
                'documents': {
                    'access': True, 'create': True, 'edit': True, 'delete': True, 'approve': True,
                    'reject': True, 'verify': True, 'validate': True, 'export': True, 'import': True,
                    'download': True, 'upload': True, 'print': True, 'process': True, 'calculate': False,
                    'generate': True, 'record': True, 'reconcile': False, 'assign': True, 'reassign': True,
                    'manage': True, 'configure': False, 'send': True, 'email': True, 'notify': True,
                    'share': True, 'activate': False, 'deactivate': False, 'suspend': False, 'close': False,
                    'monitor': True, 'audit': True, 'backup': False, 'restore': False
                },
                'customer_documents': {
                    'access': True, 'create': True, 'edit': True, 'delete': False, 'approve': True,
                    'reject': True, 'verify': True, 'validate': True, 'export': True, 'import': True,
                    'download': True, 'upload': True, 'print': True, 'process': True, 'calculate': False,
                    'generate': True, 'record': True, 'reconcile': False, 'assign': True, 'reassign': True,
                    'manage': True, 'configure': False, 'send': True, 'email': True, 'notify': True,
                    'share': True, 'activate': False, 'deactivate': False, 'suspend': False, 'close': False,
                    'monitor': True, 'audit': True, 'backup': False, 'restore': False
                },
                'payment_receipts': {
                    'access': True, 'create': True, 'edit': True, 'delete': False, 'approve': True,
                    'reject': False, 'verify': True, 'validate': True, 'export': True, 'import': False,
                    'download': True, 'upload': False, 'print': True, 'process': True, 'calculate': True,
                    'generate': True, 'record': True, 'reconcile': True, 'assign': False, 'reassign': False,
                    'manage': True, 'configure': False, 'send': True, 'email': True, 'notify': True,
                    'share': True, 'activate': False, 'deactivate': False, 'suspend': False, 'close': False,
                    'monitor': True, 'audit': True, 'backup': False, 'restore': False
                },
                'notifications': {
                    'access': True, 'create': True, 'edit': True, 'delete': True, 'approve': False,
                    'reject': False, 'verify': False, 'validate': False, 'export': True, 'import': False,
                    'download': True, 'upload': False, 'print': False, 'process': True, 'calculate': False,
                    'generate': True, 'record': True, 'reconcile': False, 'assign': False, 'reassign': False,
                    'manage': True, 'configure': True, 'send': True, 'email': True, 'notify': True,
                    'share': False, 'activate': False, 'deactivate': False, 'suspend': False, 'close': False,
                    'monitor': True, 'audit': True, 'backup': False, 'restore': False
                },
                'settings': {action: False for action in ACTIONS},  # No settings access for team leaders
                'branch_settings': {
                    'access': True, 'create': False, 'edit': True, 'delete': False, 'approve': False,
                    'reject': False, 'verify': False, 'validate': False, 'export': False, 'import': False,
                    'download': False, 'upload': False, 'print': False, 'process': False, 'calculate': False,
                    'generate': False, 'record': False, 'reconcile': False, 'assign': False, 'reassign': False,
                    'manage': True, 'configure': True, 'send': False, 'email': False, 'notify': False,
                    'share': False, 'activate': False, 'deactivate': False, 'suspend': False, 'close': False,
                    'monitor': True, 'audit': False, 'backup': False, 'restore': False
                },
                'system_settings': {action: False for action in ACTIONS},  # No system settings access
            },
            'loan_officer': {
                'dashboard': {
                    'access': True, 'create': False, 'edit': False, 'delete': False, 'approve': False,
                    'reject': False, 'verify': False, 'validate': False, 'export': True, 'import': False,
                    'download': True, 'upload': False, 'print': True, 'process': False, 'calculate': True,
                    'generate': True, 'record': False, 'reconcile': False, 'assign': False, 'reassign': False,
                    'manage': False, 'configure': False, 'send': False, 'email': False, 'notify': False,
                    'share': False, 'activate': False, 'deactivate': False, 'suspend': False, 'close': False,
                    'monitor': True, 'audit': False, 'backup': False, 'restore': False
                },
                'clients': {
                    'access': True, 'create': True, 'edit': True, 'delete': False, 'approve': False,
                    'reject': False, 'verify': True, 'validate': True, 'export': True, 'import': False,
                    'download': True, 'upload': True, 'print': True, 'process': True, 'calculate': False,
                    'generate': True, 'record': True, 'reconcile': False, 'assign': False, 'reassign': False,
                    'manage': True, 'configure': False, 'send': True, 'email': True, 'notify': True,
                    'share': False, 'activate': False, 'deactivate': False, 'suspend': False, 'close': False,
                    'monitor': True, 'audit': False, 'backup': False, 'restore': False
                },
                'loans': {
                    'access': True, 'create': True, 'edit': True, 'delete': False, 'approve': False,
                    'reject': False, 'verify': True, 'validate': True, 'export': True, 'import': False,
                    'download': True, 'upload': True, 'print': True, 'process': True, 'calculate': True,
                    'generate': True, 'record': True, 'reconcile': False, 'assign': False, 'reassign': False,
                    'manage': True, 'configure': False, 'send': True, 'email': True, 'notify': True,
                    'share': False, 'activate': False, 'deactivate': False, 'suspend': False, 'close': False,
                    'monitor': True, 'audit': False, 'backup': False, 'restore': False
                },
                'repayments': {
                    'access': True, 'create': True, 'edit': True, 'delete': False, 'approve': False,
                    'reject': False, 'verify': True, 'validate': True, 'export': True, 'import': False,
                    'download': True, 'upload': False, 'print': True, 'process': True, 'calculate': True,
                    'generate': True, 'record': True, 'reconcile': True, 'assign': False, 'reassign': False,
                    'manage': False, 'configure': False, 'send': True, 'email': True, 'notify': True,
                    'share': False, 'activate': False, 'deactivate': False, 'suspend': False, 'close': False,
                    'monitor': True, 'audit': False, 'backup': False, 'restore': False
                },
                'portfolio': {
                    'access': True, 'create': False, 'edit': False, 'delete': False, 'approve': False,
                    'reject': False, 'verify': False, 'validate': False, 'export': True, 'import': False,
                    'download': True, 'upload': False, 'print': True, 'process': False, 'calculate': True,
                    'generate': True, 'record': False, 'reconcile': False, 'assign': False, 'reassign': False,
                    'manage': False, 'configure': False, 'send': False, 'email': False, 'notify': False,
                    'share': False, 'activate': False, 'deactivate': False, 'suspend': False, 'close': False,
                    'monitor': True, 'audit': False, 'backup': False, 'restore': False
                },
                'reports_and_statements': {
                    'access': True, 'create': False, 'edit': False, 'delete': False, 'approve': False,
                    'reject': False, 'verify': False, 'validate': False, 'export': True, 'import': False,
                    'download': True, 'upload': False, 'print': True, 'process': False, 'calculate': False,
                    'generate': True, 'record': False, 'reconcile': False, 'assign': False, 'reassign': False,
                    'manage': False, 'configure': False, 'send': True, 'email': True, 'notify': False,
                    'share': False, 'activate': False, 'deactivate': False, 'suspend': False, 'close': False,
                    'monitor': False, 'audit': False, 'backup': False, 'restore': False
                },
                'documents': {
                    'access': True, 'create': True, 'edit': True, 'delete': False, 'approve': False,
                    'reject': False, 'verify': True, 'validate': True, 'export': False, 'import': False,
                    'download': True, 'upload': True, 'print': True, 'process': False, 'calculate': False,
                    'generate': False, 'record': False, 'reconcile': False, 'assign': False, 'reassign': False,
                    'manage': False, 'configure': False, 'send': False, 'email': False, 'notify': False,
                    'share': False, 'activate': False, 'deactivate': False, 'suspend': False, 'close': False,
                    'monitor': False, 'audit': False, 'backup': False, 'restore': False
                },
                'customer_documents': {
                    'access': True, 'create': True, 'edit': True, 'delete': False, 'approve': False,
                    'reject': False, 'verify': True, 'validate': True, 'export': False, 'import': False,
                    'download': True, 'upload': True, 'print': True, 'process': True, 'calculate': False,
                    'generate': False, 'record': True, 'reconcile': False, 'assign': False, 'reassign': False,
                    'manage': False, 'configure': False, 'send': False, 'email': False, 'notify': False,
                    'share': False, 'activate': False, 'deactivate': False, 'suspend': False, 'close': False,
                    'monitor': False, 'audit': False, 'backup': False, 'restore': False
                },
                'payment_receipts': {
                    'access': True, 'create': True, 'edit': False, 'delete': False, 'approve': False,
                    'reject': False, 'verify': False, 'validate': False, 'export': True, 'import': False,
                    'download': True, 'upload': False, 'print': True, 'process': False, 'calculate': False,
                    'generate': True, 'record': False, 'reconcile': False, 'assign': False, 'reassign': False,
                    'manage': False, 'configure': False, 'send': True, 'email': True, 'notify': False,
                    'share': False, 'activate': False, 'deactivate': False, 'suspend': False, 'close': False,
                    'monitor': False, 'audit': False, 'backup': False, 'restore': False
                },
                'notifications': {
                    'access': True, 'create': True, 'edit': False, 'delete': False, 'approve': False,
                    'reject': False, 'verify': False, 'validate': False, 'export': False, 'import': False,
                    'download': False, 'upload': False, 'print': False, 'process': False, 'calculate': False,
                    'generate': False, 'record': False, 'reconcile': False, 'assign': False, 'reassign': False,
                    'manage': False, 'configure': False, 'send': True, 'email': True, 'notify': True,
                    'share': False, 'activate': False, 'deactivate': False, 'suspend': False, 'close': False,
                    'monitor': False, 'audit': False, 'backup': False, 'restore': False
                },
                'settings': {action: False for action in ACTIONS},
                'branch_settings': {action: False for action in ACTIONS},
                'system_settings': {action: False for action in ACTIONS},
            },
            'secretary': {
                'dashboard': {
                    'access': True, 'create': False, 'edit': False, 'delete': False, 'approve': False,
                    'reject': False, 'verify': False, 'validate': False, 'export': True, 'import': False,
                    'download': True, 'upload': False, 'print': True, 'process': False, 'calculate': False,
                    'generate': True, 'record': False, 'reconcile': False, 'assign': False, 'reassign': False,
                    'manage': False, 'configure': False, 'send': False, 'email': False, 'notify': False,
                    'share': False, 'activate': False, 'deactivate': False, 'suspend': False, 'close': False,
                    'monitor': True, 'audit': False, 'backup': False, 'restore': False
                },
                'clients': {
                    'access': True, 'create': True, 'edit': True, 'delete': False, 'approve': False,
                    'reject': False, 'verify': False, 'validate': False, 'export': True, 'import': True,
                    'download': True, 'upload': True, 'print': True, 'process': False, 'calculate': False,
                    'generate': True, 'record': True, 'reconcile': False, 'assign': False, 'reassign': False,
                    'manage': False, 'configure': False, 'send': True, 'email': True, 'notify': True,
                    'share': False, 'activate': False, 'deactivate': False, 'suspend': False, 'close': False,
                    'monitor': False, 'audit': False, 'backup': False, 'restore': False
                },
                'loans': {
                    'access': True, 'create': True, 'edit': True, 'delete': False, 'approve': False,
                    'reject': False, 'verify': False, 'validate': False, 'export': True, 'import': False,
                    'download': True, 'upload': True, 'print': True, 'process': False, 'calculate': False,
                    'generate': True, 'record': True, 'reconcile': False, 'assign': False, 'reassign': False,
                    'manage': False, 'configure': False, 'send': True, 'email': True, 'notify': True,
                    'share': False, 'activate': False, 'deactivate': False, 'suspend': False, 'close': False,
                    'monitor': False, 'audit': False, 'backup': False, 'restore': False
                },
                'repayments': {
                    'access': True, 'create': True, 'edit': False, 'delete': False, 'approve': False,
                    'reject': False, 'verify': False, 'validate': False, 'export': True, 'import': False,
                    'download': True, 'upload': False, 'print': True, 'process': False, 'calculate': False,
                    'generate': True, 'record': True, 'reconcile': False, 'assign': False, 'reassign': False,
                    'manage': False, 'configure': False, 'send': False, 'email': False, 'notify': False,
                    'share': False, 'activate': False, 'deactivate': False, 'suspend': False, 'close': False,
                    'monitor': False, 'audit': False, 'backup': False, 'restore': False
                },
                'portfolio': {action: False for action in ACTIONS},  # No portfolio access
                'reports_and_statements': {
                    'access': True, 'create': False, 'edit': False, 'delete': False, 'approve': False,
                    'reject': False, 'verify': False, 'validate': False, 'export': True, 'import': False,
                    'download': True, 'upload': False, 'print': True, 'process': False, 'calculate': False,
                    'generate': True, 'record': False, 'reconcile': False, 'assign': False, 'reassign': False,
                    'manage': False, 'configure': False, 'send': True, 'email': True, 'notify': False,
                    'share': False, 'activate': False, 'deactivate': False, 'suspend': False, 'close': False,
                    'monitor': False, 'audit': False, 'backup': False, 'restore': False
                },
                'documents': {
                    'access': True, 'create': True, 'edit': True, 'delete': True, 'approve': False,
                    'reject': False, 'verify': False, 'validate': False, 'export': True, 'import': True,
                    'download': True, 'upload': True, 'print': True, 'process': True, 'calculate': False,
                    'generate': True, 'record': True, 'reconcile': False, 'assign': False, 'reassign': False,
                    'manage': True, 'configure': False, 'send': True, 'email': True, 'notify': False,
                    'share': True, 'activate': False, 'deactivate': False, 'suspend': False, 'close': False,
                    'monitor': False, 'audit': False, 'backup': False, 'restore': False
                },
                'customer_documents': {
                    'access': True, 'create': True, 'edit': True, 'delete': False, 'approve': False,
                    'reject': False, 'verify': False, 'validate': False, 'export': True, 'import': True,
                    'download': True, 'upload': True, 'print': True, 'process': True, 'calculate': False,
                    'generate': True, 'record': True, 'reconcile': False, 'assign': False, 'reassign': False,
                    'manage': True, 'configure': False, 'send': True, 'email': True, 'notify': False,
                    'share': True, 'activate': False, 'deactivate': False, 'suspend': False, 'close': False,
                    'monitor': False, 'audit': False, 'backup': False, 'restore': False
                },
                'payment_receipts': {
                    'access': True, 'create': True, 'edit': True, 'delete': False, 'approve': False,
                    'reject': False, 'verify': False, 'validate': False, 'export': True, 'import': False,
                    'download': True, 'upload': False, 'print': True, 'process': True, 'calculate': False,
                    'generate': True, 'record': True, 'reconcile': False, 'assign': False, 'reassign': False,
                    'manage': True, 'configure': False, 'send': True, 'email': True, 'notify': False,
                    'share': False, 'activate': False, 'deactivate': False, 'suspend': False, 'close': False,
                    'monitor': False, 'audit': False, 'backup': False, 'restore': False
                },
                'notifications': {
                    'access': True, 'create': True, 'edit': True, 'delete': True, 'approve': False,
                    'reject': False, 'verify': False, 'validate': False, 'export': False, 'import': False,
                    'download': False, 'upload': False, 'print': False, 'process': True, 'calculate': False,
                    'generate': True, 'record': True, 'reconcile': False, 'assign': False, 'reassign': False,
                    'manage': True, 'configure': True, 'send': True, 'email': True, 'notify': True,
                    'share': False, 'activate': False, 'deactivate': False, 'suspend': False, 'close': False,
                    'monitor': False, 'audit': False, 'backup': False, 'restore': False
                },
                'settings': {action: False for action in ACTIONS},
                'branch_settings': {action: False for action in ACTIONS},
                'system_settings': {action: False for action in ACTIONS},
            },
            'auditor': {
                # Auditor has mostly read-only access
                module: {
                    'access': True, 'create': False, 'edit': False, 'delete': False, 'approve': False,
                    'reject': False, 'verify': False, 'validate': False, 'export': True, 'import': False,
                    'download': True, 'upload': False, 'print': True, 'process': False, 'calculate': False,
                    'generate': True, 'record': False, 'reconcile': False, 'assign': False, 'reassign': False,
                    'manage': False, 'configure': False, 'send': False, 'email': False, 'notify': False,
                    'share': False, 'activate': False, 'deactivate': False, 'suspend': False, 'close': False,
                    'monitor': True, 'audit': True, 'backup': False, 'restore': False
                }
                for module in MODULES
            },
            'borrower': {
                # Borrower has very limited access
                module: {action: False for action in ACTIONS}
                for module in MODULES
            }
        }
        
        # Set specific permissions for borrower
        DEFAULT_PERMISSIONS['borrower']['dashboard']['access'] = True
        DEFAULT_PERMISSIONS['borrower']['loans']['access'] = True
        DEFAULT_PERMISSIONS['borrower']['repayments']['access'] = True
        DEFAULT_PERMISSIONS['borrower']['documents']['access'] = True
        DEFAULT_PERMISSIONS['borrower']['customer_documents']['access'] = True
        DEFAULT_PERMISSIONS['borrower']['payment_receipts']['access'] = True
        DEFAULT_PERMISSIONS['borrower']['notifications']['access'] = True
        
        try:
            with transaction.atomic():
                # Clear existing permissions
                self.stdout.write('Clearing existing permissions...')
                RolePermission.objects.all().delete()
                DefaultRolePermission.objects.all().delete()
                
                permissions_created = 0
                
                # Create default and role permissions
                for role in ROLES:
                    self.stdout.write(f'Creating permissions for {role}...')
                    
                    for module in MODULES:
                        for action in ACTIONS:
                            is_allowed = DEFAULT_PERMISSIONS[role][module][action]
                            
                            # Create default role permission
                            DefaultRolePermission.objects.create(
                                role=role,
                                module=module,
                                action=action,
                                is_allowed=is_allowed,
                                description=f'Default {action} permission for {module} module'
                            )
                            
                            # Create role permission
                            RolePermission.objects.create(
                                role=role,
                                module=module,
                                action=action,
                                is_allowed=is_allowed
                            )
                            
                            permissions_created += 1
                
                self.stdout.write(
                    self.style.SUCCESS(
                        f'Successfully created {permissions_created} permissions for {len(ROLES)} roles'
                    )
                )
                
                # Display summary
                for role in ROLES:
                    count = RolePermission.objects.filter(role=role, is_allowed=True).count()
                    self.stdout.write(f'  {role.title()}: {count} permissions granted')
                
        except Exception as e:
            self.stdout.write(
                self.style.ERROR(f'Error setting up permissions: {str(e)}')
            )
            raise