"""
Management command to setup roles and permissions
"""
from django.core.management.base import BaseCommand
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from core.models import Role, MenuPermission, CustomUser


class Command(BaseCommand):
    help = 'Setup roles and permissions for multi-role system'

    def handle(self, *args, **options):
        self.stdout.write('Setting up roles and permissions...')
        
        # Create menu permissions
        self.create_menu_permissions()
        
        # Create roles
        self.create_roles()
        
        # Assign permissions to roles
        self.assign_permissions_to_roles()
        
        self.stdout.write(
            self.style.SUCCESS('Successfully setup roles and permissions!')
        )

    def create_menu_permissions(self):
        """Create menu permissions for all modules"""
        modules = [
            'dashboard', 'references', 'beneficiaries', 'business', 'complaints',
            'documents', 'tourism', 'posyandu', 'news', 'village_profile',
            'organization', 'layanan', 'reports', 'settings'
        ]
        
        actions = ['view', 'add', 'change', 'delete', 'export', 'import']
        
        for module in modules:
            for action in actions:
                name = f"{module}_{action}"
                codename = f"{module}.{action}"
                
                permission, created = MenuPermission.objects.get_or_create(
                    module=module,
                    action=action,
                    defaults={
                        'name': name,
                        'codename': codename,
                        'description': f"Permission to {action} {module}",
                        'is_active': True
                    }
                )
                
                if created:
                    self.stdout.write(f'Created permission: {name}')
                else:
                    self.stdout.write(f'Permission already exists: {name}')

    def create_roles(self):
        """Create roles with appropriate permissions"""
        role_configs = {
            'super_admin': {
                'display_name': 'Super Admin',
                'description': 'Full access to all modules and settings',
                'permissions': ['*']  # All permissions
            },
            'admin': {
                'display_name': 'Admin',
                'description': 'Administrative access to most modules',
                'permissions': ['dashboard', 'references', 'beneficiaries', 'business', 
                              'complaints', 'documents', 'tourism', 'posyandu', 'news', 
                              'village_profile', 'organization', 'layanan', 'reports']
            },
            'data_manager': {
                'display_name': 'Data Manager',
                'description': 'Manage data in all modules',
                'permissions': ['references', 'beneficiaries', 'business', 'documents', 
                              'tourism', 'posyandu', 'news', 'village_profile', 'organization']
            },
            'beneficiary_manager': {
                'display_name': 'Manager Penerima Bantuan',
                'description': 'Manage beneficiary data',
                'permissions': ['beneficiaries', 'reports']
            },
            'business_manager': {
                'display_name': 'Manager Usaha',
                'description': 'Manage business data',
                'permissions': ['business', 'reports']
            },
            'news_manager': {
                'display_name': 'Manager Berita',
                'description': 'Manage news and announcements',
                'permissions': ['news', 'reports']
            },
            'village_staff': {
                'display_name': 'Staff Desa',
                'description': 'Basic staff access',
                'permissions': ['dashboard', 'references', 'beneficiaries', 'business', 
                              'complaints', 'documents', 'tourism', 'posyandu', 'news', 
                              'village_profile', 'organization', 'layanan']
            },
            'moderator': {
                'display_name': 'Moderator',
                'description': 'Moderate content and complaints',
                'permissions': ['complaints', 'news', 'reports']
            },
            'viewer': {
                'display_name': 'Viewer',
                'description': 'View-only access',
                'permissions': ['dashboard', 'references', 'beneficiaries', 'business', 
                              'complaints', 'documents', 'tourism', 'posyandu', 'news', 
                              'village_profile', 'organization', 'layanan', 'reports']
            }
        }
        
        for role_name, config in role_configs.items():
            role, created = Role.objects.get_or_create(
                name=role_name,
                defaults={
                    'display_name': config['display_name'],
                    'description': config['description'],
                    'is_active': True
                }
            )
            
            if created:
                self.stdout.write(f'Created role: {role.display_name}')
            else:
                self.stdout.write(f'Role already exists: {role.display_name}')

    def assign_permissions_to_roles(self):
        """Assign menu permissions to roles"""
        # Get all menu permissions
        all_permissions = MenuPermission.objects.filter(is_active=True)
        
        # Super Admin gets all permissions
        super_admin_role = Role.objects.get(name='super_admin')
        super_admin_role.menu_permissions.set(all_permissions)
        
        # Admin gets most permissions (except settings)
        admin_role = Role.objects.get(name='admin')
        admin_permissions = all_permissions.exclude(module='settings')
        admin_role.menu_permissions.set(admin_permissions)
        
        # Data Manager gets data-related permissions
        data_manager_role = Role.objects.get(name='data_manager')
        data_permissions = all_permissions.filter(
            module__in=['references', 'beneficiaries', 'business', 'documents', 
                       'tourism', 'posyandu', 'news', 'village_profile', 'organization']
        )
        data_manager_role.menu_permissions.set(data_permissions)
        
        # Beneficiary Manager gets beneficiary permissions
        beneficiary_role = Role.objects.get(name='beneficiary_manager')
        beneficiary_permissions = all_permissions.filter(module='beneficiaries')
        beneficiary_role.menu_permissions.set(beneficiary_permissions)
        
        # Business Manager gets business permissions
        business_role = Role.objects.get(name='business_manager')
        business_permissions = all_permissions.filter(module='business')
        business_role.menu_permissions.set(business_permissions)
        
        # News Manager gets news permissions
        news_role = Role.objects.get(name='news_manager')
        news_permissions = all_permissions.filter(module='news')
        news_role.menu_permissions.set(news_permissions)
        
        # Village Staff gets basic permissions (view and add only)
        village_staff_role = Role.objects.get(name='village_staff')
        staff_permissions = all_permissions.filter(
            module__in=['dashboard', 'references', 'beneficiaries', 'business', 
                       'complaints', 'documents', 'tourism', 'posyandu', 'news', 
                       'village_profile', 'organization', 'layanan'],
            action__in=['view', 'add']
        )
        village_staff_role.menu_permissions.set(staff_permissions)
        
        # Moderator gets moderation permissions
        moderator_role = Role.objects.get(name='moderator')
        moderator_permissions = all_permissions.filter(
            module__in=['complaints', 'news', 'reports'],
            action__in=['view', 'change']
        )
        moderator_role.menu_permissions.set(moderator_permissions)
        
        # Viewer gets view-only permissions
        viewer_role = Role.objects.get(name='viewer')
        viewer_permissions = all_permissions.filter(action='view')
        viewer_role.menu_permissions.set(viewer_permissions)
        
        self.stdout.write('Assigned permissions to roles')
