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",
	"session;assign_invigilator",
]


def add_invigilator_setting(apps, schema_editor):
	EsSetting = apps.get_model("api", "EsSetting")
	EsSetting.objects.update_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_invigilator_setting(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", "0070_add_import_tables_setting"),
	]

	operations = [
		migrations.RunPython(add_invigilator_setting, reverse_invigilator_setting),
		migrations.RunPython(update_first_admin_role, reverse_update_first_admin_role),
	]
