from datetime import datetime, time as dt_time

from django.test import SimpleTestCase

from api.services.exam_scheduler.slots import (
	SLOT_MINUTES,
	_datetime_to_slot,
	_duration_slots,
	_duration_time,
	_slot_to_datetime,
)


class FakeRequirement:
	def __init__(self, writing_time, reading_time):
		self.writing_time = writing_time
		self.reading_time = reading_time


class SchedulerSlotTests(SimpleTestCase):
	def test_duration_slots_round_up_to_thirty_minutes(self):
		requirement = FakeRequirement(dt_time(1, 0), dt_time(0, 0))
		self.assertEqual(_duration_slots(requirement), 2)
		self.assertEqual(_duration_time(requirement), dt_time(1, 0))

		with_reading = FakeRequirement(dt_time(1, 0), dt_time(0, 20))
		self.assertEqual(_duration_slots(with_reading), 3)
		self.assertEqual(_duration_time(with_reading), dt_time(1, 20))

		empty = FakeRequirement(None, None)
		self.assertEqual(_duration_slots(empty), 2)

	def test_datetime_slot_round_trip(self):
		value = datetime(2026, 3, 2, 9, 0, 0)
		slot = _datetime_to_slot(None, value)
		self.assertIsNotNone(slot)
		self.assertEqual(slot % 1, 0)
		restored = _slot_to_datetime(None, slot)
		self.assertEqual(restored, value)
		self.assertEqual((restored - value).total_seconds(), 0)

	def test_non_aligned_datetime_is_rejected(self):
		self.assertIsNone(_datetime_to_slot(None, datetime(2026, 3, 2, 9, 15, 0)))

	def test_slot_minutes_is_thirty(self):
		self.assertEqual(SLOT_MINUTES, 30)
		start = datetime(2026, 3, 2, 9, 0, 0)
		end = _slot_to_datetime(None, _datetime_to_slot(None, start) + 2)
		self.assertEqual((end - start).total_seconds(), 3600)
