# Generated by Django 4.2.9 on 2026-02-16 13:51

from django.db import migrations
from django.db.models import Count, Max


def dedupe_class_subject_allocations(apps, schema_editor):
    ClassSubjectAllocation = apps.get_model("app", "ClassSubjectAllocation")
    db_alias = schema_editor.connection.alias
    duplicate_groups = (
        ClassSubjectAllocation.objects.using(db_alias).values("academic_class_stream_id", "subject_id")
        .annotate(row_count=Count("id"), keep_id=Max("id"))
        .filter(row_count__gt=1)
    )

    for group in duplicate_groups:
        (
            ClassSubjectAllocation.objects.using(db_alias).filter(
                academic_class_stream_id=group["academic_class_stream_id"],
                subject_id=group["subject_id"],
            )
            .exclude(id=group["keep_id"])
            .delete()
        )


def noop_reverse(apps, schema_editor):
    pass


class AlterUniqueTogetherIfMissing(migrations.AlterUniqueTogether):
    """Apply unique_together only when equivalent unique constraints are absent."""

    def database_forwards(self, app_label, schema_editor, from_state, to_state):
        desired_uniques = self.unique_together or set()
        if not desired_uniques:
            return super().database_forwards(app_label, schema_editor, from_state, to_state)

        model = to_state.apps.get_model(app_label, self.name)
        table_name = model._meta.db_table

        desired_column_sets = set()
        for field_names in desired_uniques:
            columns = tuple(model._meta.get_field(field_name).column for field_name in field_names)
            desired_column_sets.add(frozenset(columns))

        with schema_editor.connection.cursor() as cursor:
            constraints = schema_editor.connection.introspection.get_constraints(cursor, table_name)

        existing_unique_column_sets = {
            frozenset(info.get("columns") or [])
            for info in constraints.values()
            if info.get("unique") and info.get("columns")
        }

        if desired_column_sets.issubset(existing_unique_column_sets):
            return

        return super().database_forwards(app_label, schema_editor, from_state, to_state)


class Migration(migrations.Migration):

    dependencies = [
        ('app', '0062_attendancesession_attendancerecord'),
    ]

    operations = [
        migrations.RunPython(dedupe_class_subject_allocations, noop_reverse),
        AlterUniqueTogetherIfMissing(
            name='classsubjectallocation',
            unique_together={('academic_class_stream', 'subject')},
        ),
    ]
