from django.test import TestCase
from course.models import Course, CourseTeacher
from teacher_management.models import Teacher
from routine.models import RoutineData, Routine
from days.models import Day
from timeslot.models import TimeSlot
from status.models import Status
from departments.models import Department
from batch.models import Batch
from batch_year.models import BatchYear
from semester.models import Semester
from course.serializers import CourseSerializer
from django.utils.text import slugify

class TeacherAvailabilityTest(TestCase):
    def setUp(self):
        # Create Statuses
        self.status_draft = Status.objects.create(title="Draft", type="routine", slug="draft-routine")
        self.status_available = Status.objects.create(title="Available", type="routine_data", slug="available-routine_data")
        self.status_active_teacher = Status.objects.create(title="Active", type="teacher", slug="active-teacher")
        self.status_available_ts = Status.objects.create(title="Available", type="time_slot", slug="available-time_slot")
        self.status_day_active = Status.objects.create(title="Active", type="day", slug="active-day")
        
        # Create Dependencies
        self.dept = Department.objects.create(department_name="CSE", department_code="CSE")
        self.batch = Batch.objects.create(batch_name="1st Batch", department=self.dept, start_year=2020, end_year=2024)
        self.year = BatchYear.objects.create(title="2024", code="2024")
        self.semester = Semester.objects.create(title="1st")
        
        # Create Teachers
        self.teacher1 = Teacher.objects.create(first_name="T1", code="T1", email="t1@test.com", phone="123", department=self.dept, status=self.status_active_teacher)
        self.teacher2 = Teacher.objects.create(first_name="T2", code="T2", email="t2@test.com", phone="124", department=self.dept, status=self.status_active_teacher)
        
        # Create Course
        self.course = Course.objects.create(
            name="Test Course", code="TC101", credit=3.0, 
            department=self.dept, batch=self.batch, year=self.year, semester=self.semester
        )
        CourseTeacher.objects.create(course=self.course, teacher=self.teacher1)
        CourseTeacher.objects.create(course=self.course, teacher=self.teacher2)
        
        # Create TimeSlot and Day
        self.day = Day.objects.create(name="Monday", status=self.status_day_active)
        self.timeslot = TimeSlot.objects.create(start_time="09:00", end_time="10:00", slot_name="Slot 1", status=self.status_available_ts)
        
        # Create Routine (Another routine where T1 is busy)
        self.routine = Routine.objects.create(
            name="Routine 1", department=self.dept, batch=self.batch, year=self.year, semester=self.semester,
            status=self.status_draft
        )
        
        # Make T1 busy
        self.another_course = Course.objects.create(
            name="Another Course", code="AC101", credit=3.0,
            department=self.dept, batch=self.batch, year=self.year, semester=self.semester
        )
        RoutineData.objects.create(
            routine=self.routine, day_of_week=self.day, time_slot=self.timeslot,
            course=self.another_course, teacher=self.teacher1, status=self.status_available
        )
        
    def test_teacher_availability(self):
        # T1 is busy, T2 is free.
        # Course has both T1 and T2.
        # Logic should return "Available" because T2 is free.
        
        context = {
            'timeslot': self.timeslot.id,
            'day_of_week': self.day.id
        }
        serializer = CourseSerializer(self.course, context=context)
        status = serializer.data['status']
        self.assertEqual(status, "Available")
