from django.core.management.base import BaseCommand
from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType

from core.models import (
    AppUser,
    Consultation,
    KnowledgeTopic,
    KnowledgeContent,
    Notification,
    AdminWorkflow,
)


class Command(BaseCommand):
    help = 'Setup admin permission groups for the application'

    def handle(self, *args, **options):
        self.stdout.write(self.style.WARNING('Setting up admin permission groups...'))

        # Get content types
        user_ct = ContentType.objects.get_for_model(AppUser)
        consultation_ct = ContentType.objects.get_for_model(Consultation)
        topic_ct = ContentType.objects.get_for_model(KnowledgeTopic)
        content_ct = ContentType.objects.get_for_model(KnowledgeContent)
        notification_ct = ContentType.objects.get_for_model(Notification)
        workflow_ct = ContentType.objects.get_for_model(AdminWorkflow)

        # Super Admin - Full access
        super_admin_group, created = Group.objects.get_or_create(name='Super Admin')
        if created:
            self.stdout.write(self.style.SUCCESS('✓ Created Super Admin group'))
        super_admin_perms = Permission.objects.filter(
            content_type__in=[
                user_ct,
                consultation_ct,
                topic_ct,
                content_ct,
                notification_ct,
                workflow_ct,
            ]
        )
        super_admin_group.permissions.set(super_admin_perms)
        self.stdout.write(f'  Assigned {super_admin_perms.count()} permissions to Super Admin')

        # Content Admin - Manage knowledge
        content_admin_group, created = Group.objects.get_or_create(name='Content Admin')
        if created:
            self.stdout.write(self.style.SUCCESS('✓ Created Content Admin group'))
        content_perms = Permission.objects.filter(
            content_type__in=[topic_ct, content_ct]
        )
        content_admin_group.permissions.set(content_perms)
        self.stdout.write(f'  Assigned {content_perms.count()} permissions to Content Admin')

        # Support Admin - Manage consultations
        support_admin_group, created = Group.objects.get_or_create(name='Support Admin')
        if created:
            self.stdout.write(self.style.SUCCESS('✓ Created Support Admin group'))
        support_perms = Permission.objects.filter(
            content_type__in=[consultation_ct, notification_ct]
        ) | Permission.objects.filter(
            content_type=user_ct,
            codename__in=['view_appuser', 'change_appuser']
        )
        support_admin_group.permissions.set(support_perms)
        self.stdout.write(f'  Assigned {support_perms.count()} permissions to Support Admin')

        # Doctor Manager - Approve doctors
        doctor_manager_group, created = Group.objects.get_or_create(name='Doctor Manager')
        if created:
            self.stdout.write(self.style.SUCCESS('✓ Created Doctor Manager group'))
        doctor_perms = Permission.objects.filter(content_type=user_ct)
        doctor_manager_group.permissions.set(doctor_perms)
        self.stdout.write(f'  Assigned {doctor_perms.count()} permissions to Doctor Manager')

        self.stdout.write(self.style.SUCCESS('\n✓ Admin permission groups setup complete!'))
        self.stdout.write(self.style.WARNING('\nAvailable groups:'))
        self.stdout.write('  • Super Admin: Full control over all models')
        self.stdout.write('  • Content Admin: Manage knowledge content only')
        self.stdout.write('  • Support Admin: Manage consultations and user support')
        self.stdout.write('  • Doctor Manager: Approve and manage doctor accounts')
