from django.db import migrations


def migrate_exam_requirement_permissions(apps, schema_editor):
    RolePermission = apps.get_model("api", "RolePermission")
    UserPermission = apps.get_model("api", "UserPermission")

    mapping = {
        "exam_requirements;create": "exam_requirement;create",
        "exam_requirements;delete": "exam_requirement;delete",
        "exam_requirements;list": "exam_requirement;list",
        "exam_requirements;update": "exam_requirement;update",
        "exam_requirements;rules": "exam_requirement;rules",
    }

    for old_code, new_code in mapping.items():
        # Role permissions
        role_ids = list(
            RolePermission.objects.filter(permission=old_code).values_list("role_id", flat=True)
        )
        for role_id in role_ids:
            RolePermission.objects.get_or_create(role_id=role_id, permission=new_code)
        RolePermission.objects.filter(permission=old_code).delete()

        # User permissions
        user_ids = list(
            UserPermission.objects.filter(permission=old_code).values_list("user_id", flat=True)
        )
        for user_id in user_ids:
            UserPermission.objects.get_or_create(user_id=user_id, permission=new_code)
        UserPermission.objects.filter(permission=old_code).delete()


def reverse_migrate_exam_requirement_permissions(apps, schema_editor):
    RolePermission = apps.get_model("api", "RolePermission")
    UserPermission = apps.get_model("api", "UserPermission")

    mapping = {
        "exam_requirement;create": "exam_requirements;create",
        "exam_requirement;delete": "exam_requirements;delete",
        "exam_requirement;list": "exam_requirements;list",
        "exam_requirement;update": "exam_requirements;update",
        "exam_requirement;rules": "exam_requirements;rules",
    }

    for old_code, new_code in mapping.items():
        # Role permissions
        role_ids = list(
            RolePermission.objects.filter(permission=old_code).values_list("role_id", flat=True)
        )
        for role_id in role_ids:
            RolePermission.objects.get_or_create(role_id=role_id, permission=new_code)
        RolePermission.objects.filter(permission=old_code).delete()

        # User permissions
        user_ids = list(
            UserPermission.objects.filter(permission=old_code).values_list("user_id", flat=True)
        )
        for user_id in user_ids:
            UserPermission.objects.get_or_create(user_id=user_id, permission=new_code)
        UserPermission.objects.filter(permission=old_code).delete()


class Migration(migrations.Migration):

    dependencies = [
        ("api", "0029_esstudent_enrolled_programme_esstudent_student_group_and_more"),
    ]

    operations = [
        migrations.RunPython(
            code=migrate_exam_requirement_permissions,
            reverse_code=reverse_migrate_exam_requirement_permissions,
        ),
    ]
