import json

from django.db import migrations

SETTING_PARAM = "invigilator_setting"
DEFAULT_INVIGILATOR_SETTING = {
	"fixed_invigilators": [{"quantity": 0, "role_ids": []}],
	"students_count": 0,
	"invigilators_count": 0,
	"include_fixed_invigilators": False,
}
PERMISSIONS = [
	"invigilator_setting;update_v2",
]


def restore_invigilator_setting_json(apps, schema_editor):
	EsSetting = apps.get_model("api", "EsSetting")
	EsSetting.objects.get_or_create(
		param=SETTING_PARAM,
		defaults={
			"value": json.dumps(DEFAULT_INVIGILATOR_SETTING),
			"comment": "Fixed invigilators, student-to-invigilator ratio, and include/exclude fixed staff",
		},
	)


def reverse_restore_invigilator_setting_json(apps, schema_editor):
	EsSetting = apps.get_model("api", "EsSetting")
	EsSetting.objects.filter(param=SETTING_PARAM).delete()


def update_first_admin_role(apps, schema_editor):
	Role = apps.get_model("api", "Role")
	RolePermission = apps.get_model("api", "RolePermission")

	role = Role.objects.filter(type="admin").first()
	if role:
		for permission in PERMISSIONS:
			RolePermission.objects.get_or_create(
				role_id=role.id,
				permission=permission,
			)


def reverse_update_first_admin_role(apps, schema_editor):
	Role = apps.get_model("api", "Role")
	RolePermission = apps.get_model("api", "RolePermission")

	role = Role.objects.filter(type="admin").first()
	if role:
		RolePermission.objects.filter(
			role_id=role.id,
			permission__in=PERMISSIONS,
		).delete()


class Migration(migrations.Migration):

	dependencies = [
		("api", "0073_esinvigilatorsetting_is_floating"),
	]

	operations = [
		migrations.RunPython(restore_invigilator_setting_json, reverse_restore_invigilator_setting_json),
		migrations.RunPython(update_first_admin_role, reverse_update_first_admin_role),
	]
