from datetime import date, time
from types import SimpleNamespace
from unittest.mock import patch

from django.test import TestCase

from api.models import (
    TtAcademicTerm, TtAcademicTermWeek, TtStudent, TtStudentResourceMap, TtWeek,
)
from api.views.admin.import_table import ImportTable


class StudentAcademicTermImportTests(TestCase):
    @patch("api.views.admin.import_table.bulk_sync_to_redis")
    def test_text_slot_setting_creates_maps_and_preserves_existing_patterns(self, sync):
        student = TtStudent.objects.create(code="STU001", name="Ada", status=1)
        weeks = [
            TtWeek.objects.create(week=number, start_date=date(2026, 1, number))
            for number in (1, 2)
        ]
        for code in ("TERM1", "TERM2"):
            term = TtAcademicTerm.objects.create(
                code=code, name=code, start_date=date(2026, 1, 1),
                end_date=date(2026, 4, 30), start_time=time(8),
                end_time=time(18), status=1,
            )
            for week in weeks:
                TtAcademicTermWeek.objects.create(academic_term=term, week=week)
        TtStudentResourceMap.objects.create(student=student, week=weeks[0], pattern="1000")
        view = ImportTable()
        view.kafka_config = {"MICROSERVICES_TT_TOPIC": ""}
        request = SimpleNamespace(user=SimpleNamespace(id=1, name="tester"))
        rows = [
            (number, {"student_id": student.code, "academic_term_id": code})
            for number, code in enumerate(("TERM1", "TERM2"), start=2)
        ]

        result = view.import_tt_student_academic_term(
            request, ["student_id", "academic_term_id"], rows, {"slot_per_week": "4"},
        )

        self.assertEqual(result["inserted"], 2)
        self.assertEqual(result["errors"], [])
        self.assertEqual(
            dict(TtStudentResourceMap.objects.filter(student=student).values_list("week_id", "pattern")),
            {weeks[0].id: "1000", weeks[1].id: "0000"},
        )
        self.assertEqual(sync.call_args.args[1], {
            "update": {"student": [{"id": student.id, "resource_map": {0: "1000", 1: "0000"}}]},
        })

        sync.reset_mock()
        result = view.import_tt_student_academic_term(
            request, ["student_id", "academic_term_id"], rows, {"slot_per_week": "4"},
        )
        self.assertEqual(result["inserted"], 0)
        self.assertEqual(TtStudentResourceMap.objects.filter(student=student).count(), 2)
        sync.assert_not_called()
