from django.core.management.base import BaseCommand, CommandError

from apps.permissions.models import Permission, Role


class Command(BaseCommand):
    help = "Assign a permission (by codename) to all roles with a given name"

    def add_arguments(self, parser):
        parser.add_argument(
            'permission_codename',
            type=str,
            help='Permission codename (e.g. view_bdc_progress)'
        )
        parser.add_argument(
            'role_name',
            type=str,
            help='Role name to assign permission to (e.g. Chief Admin)'
        )

    def handle(self, *args, **options):
        permission_codename = options['permission_codename']
        role_name = options['role_name']

        try:
            permission = Permission.objects.get(codename=permission_codename)
        except Permission.DoesNotExist:
            raise CommandError(
                f"Permission with codename '{permission_codename}' does not exist"
            )

        roles = Role.objects.filter(name=role_name)

        if not roles.exists():
            self.stdout.write(
                self.style.WARNING(f"No roles found with name '{role_name}'")
            )
            return

        assigned_count = 0

        for role in roles:
            if not role.permissions.filter(id=permission.id).exists():
                role.permissions.add(permission)
                assigned_count += 1
                self.stdout.write(
                    f"Assigned '{permission_codename}' to role '{role.name}' (id={role.id})"
                )

        self.stdout.write(
            self.style.SUCCESS(
                f"Permission '{permission_codename}' assigned to {assigned_count} role(s) named '{role_name}'"
            )
        )
