from django.test import TestCase

from api.models import EsDepartment, EsPos, EsStudent, EsStudentGroup, EsStudentStudentGroup
from api.tests.helpers import create_admin_client, post_signed, unique_code

UPDATE_STUDENT_URL = "/api/admin/student/update"


class StudentUpdateUnsetTests(TestCase):
	def setUp(self):
		self.user, self.client, self.token = create_admin_client(["student;update"])
		self.department = EsDepartment.objects.create(
			code=unique_code("D"),
			name="Department",
			status=EsDepartment.STATUS_TO_CODE["active"],
		)
		self.programme = EsPos.objects.create(
			code=unique_code("P"),
			name="Programme",
			status=EsPos.STATUS_TO_CODE["active"],
		)
		self.group = EsStudentGroup.objects.create(
			code=unique_code("G"),
			name="Group",
			status=EsStudentGroup.STATUS_TO_CODE["active"],
		)
		self.student = EsStudent.objects.create(
			code=unique_code("S"),
			name="Student",
			department=self.department,
			enrolled_programme=self.programme,
			student_group=self.group,
			status=EsStudent.STATUS_TO_CODE["active"],
		)
		EsStudentStudentGroup.objects.create(student=self.student, student_group=self.group)

	def test_null_clears_department_programme_and_groups(self):
		cleared = post_signed(
			self.client,
			UPDATE_STUDENT_URL,
			{
				"id": [self.student.id],
				"department_id": None,
				"enrolled_programme_id": None,
				"student_group_ids": None,
			},
		)
		self.assertEqual(cleared.status_code, 200)

		self.student.refresh_from_db()
		self.assertIsNone(self.student.department_id)
		self.assertIsNone(self.student.enrolled_programme_id)
		self.assertIsNone(self.student.student_group_id)
		self.assertFalse(EsStudentStudentGroup.objects.filter(student=self.student).exists())

		renamed = post_signed(
			self.client,
			UPDATE_STUDENT_URL,
			{"id": [self.student.id], "name": "Renamed"},
		)
		self.assertEqual(renamed.status_code, 200)

		self.student.refresh_from_db()
		self.assertEqual(self.student.name, "Renamed")
		self.assertIsNone(self.student.department_id)
		self.assertIsNone(self.student.enrolled_programme_id)
		self.assertIsNone(self.student.student_group_id)
		self.assertFalse(EsStudentStudentGroup.objects.filter(student=self.student).exists())

	def test_empty_student_group_id_clears_groups(self):
		cleared = post_signed(
			self.client,
			UPDATE_STUDENT_URL,
			{
				"id": [self.student.id],
				"department_id": "",
				"student_group_id": "",
			},
		)
		self.assertEqual(cleared.status_code, 200)

		self.student.refresh_from_db()
		self.assertIsNone(self.student.department_id)
		self.assertEqual(self.student.enrolled_programme_id, self.programme.id)
		self.assertIsNone(self.student.student_group_id)
		self.assertFalse(EsStudentStudentGroup.objects.filter(student=self.student).exists())
