from api.models import AuditTrailDetails
from api.services.exam_scheduler import schedule_exam_requirements, unschedule_exam_requirements
from api.tests.helpers import SchedulerTestCase, build_exam_world, post_signed, reload_activity

UNSCHEDULE_URL = "/api/admin/exam-activity/unschedule"


class ExamActivityUnscheduleHttpTests(SchedulerTestCase):
	def test_unschedule_clears_fields_and_returns_empty_data(self):
		world = build_exam_world()
		schedule_exam_requirements([world.activity.id], self.user.id)
		scheduled = reload_activity(world.activity)
		self.assertTrue(scheduled.is_scheduled)

		response = post_signed(self.client, UNSCHEDULE_URL, {"id": [world.activity.id]})
		self.assertEqual(response.status_code, 200)
		self.assertEqual(response.json()["code"], 200)
		self.assertEqual(response.json()["data"], {})

		activity = reload_activity(world.activity)
		self.assertFalse(activity.is_scheduled)
		self.assertIsNone(activity.time_slot)
		self.assertIsNone(activity.location_id)
		self.assertIsNone(activity.session_id)
		self.assertTrue(
			AuditTrailDetails.objects.filter(action="exam_activity_unschedule").exists()
		)


class ExamActivityUnscheduleServiceTests(SchedulerTestCase):
	def test_unschedule_is_idempotent_for_already_clear_activities(self):
		world = build_exam_world()
		first = unschedule_exam_requirements([world.activity.id], self.user.id)
		second = unschedule_exam_requirements([world.activity.id], self.user.id)
		activity = reload_activity(world.activity)
		self.assertFalse(activity.is_scheduled)
		self.assertIsNone(activity.time_slot)
		self.assertEqual(first["old_data"], {})
		self.assertEqual(first["new_data"], {})
		self.assertEqual(second["old_data"], {})
		self.assertEqual(second["new_data"], {})
		self.assertEqual(first["data"]["activities"][0]["id"], world.activity.id)

	def test_unschedule_clears_previously_scheduled_activity(self):
		world = build_exam_world()
		session = world.add_session()
		world.mark_scheduled(world.activity, session=session)
		result = unschedule_exam_requirements([world.activity.id], self.user.id)
		activity = reload_activity(world.activity)
		self.assertFalse(activity.is_scheduled)
		self.assertIsNone(activity.time_slot)
		self.assertIsNone(activity.location_id)
		self.assertIsNone(activity.session_id)
		self.assertEqual(result["old_data"][world.activity.id]["is_scheduled"], True)
		self.assertEqual(result["new_data"][world.activity.id]["is_scheduled"], False)
		self.assertEqual(result["data"]["activities"][0]["time_slot"], None)
