# Generated by Django 4.2.9 on 2026-02-27 13:30

from django.db import migrations, models
import django.db.models.deletion


def backfill_timetable_allocations(apps, schema_editor):
    Timetable = apps.get_model("app", "Timetable")
    ClassSubjectAllocation = apps.get_model("app", "ClassSubjectAllocation")
    db_alias = schema_editor.connection.alias

    allocation_rows = ClassSubjectAllocation.objects.using(db_alias).values(
        "id",
        "academic_class_stream_id",
        "subject_id",
        "subject_teacher_id",
    )

    by_stream_subject = {}
    by_stream_subject_teacher = {}
    for row in allocation_rows:
        stream_subject_key = (row["academic_class_stream_id"], row["subject_id"])
        by_stream_subject[stream_subject_key] = row
        by_stream_subject_teacher[(
            row["academic_class_stream_id"],
            row["subject_id"],
            row["subject_teacher_id"],
        )] = row

    lessons = Timetable.objects.using(db_alias).filter(allocation_id__isnull=True)
    for lesson in lessons.iterator(chunk_size=500):
        allocation = None
        if lesson.teacher_id:
            allocation = by_stream_subject_teacher.get(
                (lesson.class_stream_id, lesson.subject_id, lesson.teacher_id)
            )
        if allocation is None:
            allocation = by_stream_subject.get((lesson.class_stream_id, lesson.subject_id))
        if allocation is None:
            continue

        updates = {"allocation_id": allocation["id"]}
        if lesson.teacher_id != allocation["subject_teacher_id"]:
            updates["teacher_id"] = allocation["subject_teacher_id"]

        Timetable.objects.using(db_alias).filter(pk=lesson.pk).update(**updates)


def noop_reverse(apps, schema_editor):
    return


class Migration(migrations.Migration):

    dependencies = [
        ("app", "0075_attendance_session_lesson_link"),
    ]

    operations = [
        migrations.AddField(
            model_name="timetable",
            name="allocation",
            field=models.ForeignKey(
                blank=True,
                null=True,
                on_delete=django.db.models.deletion.SET_NULL,
                related_name="timetable_entries",
                to="app.classsubjectallocation",
            ),
        ),
        migrations.RunPython(backfill_timetable_allocations, reverse_code=noop_reverse),
    ]
