from datetime import date, time
from types import SimpleNamespace

from django.test import TestCase

from api.models import (
    TtAcademicTerm,
    TtPos,
    TtStudent,
    TtStudentAcademicTerm,
    TtStudentPos,
    TtStudentSet,
    TtStudentSetStudent,
)
from api.views.admin.import_table import ImportTable


class StudentSetStudentImportTests(TestCase):
    def setUp(self):
        self.term = TtAcademicTerm.objects.create(
            code="AT202609",
            name="Sep Sem 2026",
            start_date=date(2026, 9, 1),
            end_date=date(2026, 12, 31),
            start_time=time(8),
            end_time=time(18),
            status=1,
        )
        self.pos = TtPos.objects.create(
            code="POS-A",
            name="Programme A",
            academic_term=self.term,
            status=1,
        )
        self.student = TtStudent.objects.create(
            code="STU001",
            name="Ada Lovelace",
            status=1,
        )
        TtStudentAcademicTerm.objects.create(
            student=self.student,
            academic_term=self.term,
        )
        TtStudentPos.objects.create(student=self.student, pos=self.pos)
        self.student_set = TtStudentSet.objects.create(
            code="SET-A",
            name="Set A",
            academic_term=self.term,
            pos=self.pos,
            planned_size=1,
            status=1,
        )
        self.view = ImportTable()
        self.view.kafka_config = {"MICROSERVICES_TT_TOPIC": ""}
        self.request = SimpleNamespace(user=SimpleNamespace(id=1, name="tester"))

    def test_imports_membership_by_student_and_student_set_codes(self):
        result = self.view.import_tt_student_set_student(
            self.request,
            ["student_set_id", "student_id"],
            [(2, {"student_set_id": "SET-A", "student_id": "STU001"})],
        )

        self.assertEqual(result["inserted"], 1)
        self.assertEqual(result["errors"], [])
        self.assertTrue(
            TtStudentSetStudent.objects.filter(
                student_set=self.student_set,
                student=self.student,
            ).exists()
        )

        repeated = self.view.import_tt_student_set_student(
            self.request,
            ["student_set_id", "student_id"],
            [(2, {"student_set_id": "SET-A", "student_id": "STU001"})],
        )
        self.assertEqual(repeated["inserted"], 0)
        self.assertEqual(repeated["skipped"], 1)

    def test_rejects_membership_when_student_is_not_assigned_to_set_pos(self):
        other = TtStudent.objects.create(code="STU002", name="Grace Hopper", status=1)
        TtStudentAcademicTerm.objects.create(student=other, academic_term=self.term)

        result = self.view.import_tt_student_set_student(
            self.request,
            ["student_set_id", "student_id"],
            [(2, {"student_set_id": "SET-A", "student_id": "STU002"})],
        )

        self.assertEqual(result["inserted"], 0)
        self.assertEqual(result["skipped"], 1)
        self.assertEqual(result["errors"][0]["field"], "student_set_id")
        self.assertFalse(
            TtStudentSetStudent.objects.filter(
                student_set=self.student_set,
                student=other,
            ).exists()
        )
