# Generated by Django 5.2.6 on 2026-06-10 17:08

from django.db import migrations, models


def populate_feature_key(apps, schema_editor):
    """Backfill TenantFeatureOverride.feature_key from module.name + '.' + name.

    Rows that already have a feature_key (from Phase 1 new inserts) are skipped.
    Rows whose module FK is NULL are also skipped (should not exist at this point).
    """
    TenantFeatureOverride = apps.get_model("platform_modules", "TenantFeatureOverride")
    rows = TenantFeatureOverride.objects.select_related("module").filter(
        feature_key=""
    )
    for row in rows:
        if row.module_id is not None:
            row.feature_key = f"{row.module.name}.{row.name}"
            row.save(update_fields=["feature_key"])


class Migration(migrations.Migration):

    dependencies = [
        ("platform_modules", "0010_add_feature_catalog_fields_modulefeature"),
    ]

    operations = [
        # 1. Backfill feature_key for existing rows.
        migrations.RunPython(populate_feature_key, migrations.RunPython.noop),

        # 2. Drop old unique constraint on (tenant, module, name, user).
        migrations.RemoveConstraint(
            model_name="tenantfeatureoverride",
            name="modules_feature_flag_unique_scope",
        ),

        # 3. Drop old index on (tenant, module, name).
        migrations.RemoveIndex(
            model_name="tenantfeatureoverride",
            name="platform_mo_tenant__601b6c_idx",
        ),

        # 4. Add new index on (tenant, feature_key).
        migrations.AddIndex(
            model_name="tenantfeatureoverride",
            index=models.Index(
                fields=["tenant", "feature_key"],
                name="platform_mo_tfoverride_fkey_idx",
            ),
        ),

        # 5. Add new partial unique constraint on (tenant, feature_key, user)
        #    only when feature_key is non-empty.
        migrations.AddConstraint(
            model_name="tenantfeatureoverride",
            constraint=models.UniqueConstraint(
                fields=("tenant", "feature_key", "user"),
                name="modules_featureoverride_unique_fkey_scope",
                condition=models.Q(feature_key__gt=""),
            ),
        ),
    ]

