"""Create Tier model and convert tier CharFields to ForeignKeys.

Applies to FeatureCatalog and ModuleCatalog.
"""

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


def _seed_default_tiers(apps, schema_editor):
    """Insert canonical tier rows so FK constraints are satisfiable."""
    Tier = apps.get_model("platform_modules", "Tier")
    defaults = [
        ("starter", "Starter", "#22c55e", 10, "Basic features for small teams."),
        ("business", "Business", "#3b82f6", 20, "Advanced features for growing businesses."),
        ("enterprise", "Enterprise", "#a855f7", 30, "Full platform with AI and custom integrations."),
    ]
    for code, name, color, sort_order, description in defaults:
        Tier.objects.get_or_create(
            code=code,
            defaults={
                "name": name,
                "color": color,
                "sort_order": sort_order,
                "description": description,
            },
        )


def _backfill_feature_catalog_tier(apps, schema_editor):
    """Migrate old tier text → FK on FeatureCatalog."""
    FeatureCatalog = apps.get_model("platform_modules", "FeatureCatalog")
    Tier = apps.get_model("platform_modules", "Tier")
    code_map = {t.code: t for t in Tier.objects.all()}
    # tier_old holds the old CharField value; tier_new is the new FK.
    for row in FeatureCatalog.objects.exclude(tier_old="").iterator():
        t = code_map.get(row.tier_old)
        if t is not None:
            row.tier_new = t
            row.save(update_fields=["tier_new"])


def _backfill_module_catalog_tier(apps, schema_editor):
    """Migrate old tier text → FK on ModuleCatalog."""
    ModuleCatalog = apps.get_model("platform_modules", "ModuleCatalog")
    Tier = apps.get_model("platform_modules", "Tier")
    code_map = {t.code: t for t in Tier.objects.all()}
    for row in ModuleCatalog.objects.exclude(tier_old="").iterator():
        t = code_map.get(row.tier_old)
        if t is not None:
            row.tier_new = t
            row.save(update_fields=["tier_new"])


class Migration(migrations.Migration):

    dependencies = [
        ("platform_modules", "0013_featuregroup"),
    ]

    operations = [
        # ── 1. Create Tier model ──────────────────────────────────────────
        migrations.CreateModel(
            name="Tier",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
                    ),
                ),
                (
                    "created_at",
                    models.DateTimeField(
                        auto_now_add=True, db_index=True, verbose_name="created at"
                    ),
                ),
                ("updated_at", models.DateTimeField(auto_now=True, verbose_name="updated at")),
                (
                    "public_id",
                    models.UUIDField(
                        db_index=True,
                        default=uuid.uuid4,
                        editable=False,
                        unique=True,
                        verbose_name="public id",
                    ),
                ),
                (
                    "code",
                    models.SlugField(
                        db_index=True,
                        help_text="Stable machine-readable code, e.g. 'starter', 'business', 'enterprise'.",
                        max_length=40,
                        unique=True,
                        verbose_name="code",
                    ),
                ),
                ("name", models.CharField(max_length=120, verbose_name="name")),
                (
                    "description",
                    models.TextField(blank=True, default="", verbose_name="description"),
                ),
                (
                    "color",
                    models.CharField(
                        default="#6b7280",
                        help_text="Hex color for badges and UI indicators.",
                        max_length=20,
                        verbose_name="color",
                    ),
                ),
                (
                    "sort_order",
                    models.PositiveSmallIntegerField(
                        db_index=True,
                        default=0,
                        help_text="Controls display order; lower values appear first.",
                        verbose_name="sort order",
                    ),
                ),
            ],
            options={
                "verbose_name": "tier",
                "verbose_name_plural": "tiers",
                "ordering": ("sort_order", "code"),
            },
        ),

        # ── 2. Seed default tiers ─────────────────────────────────────────
        migrations.RunPython(_seed_default_tiers, migrations.RunPython.noop),

        # ── 3. FeatureCatalog: rename old tier → tier_old ──────────────────
        migrations.RenameField(
            model_name="featurecatalog",
            old_name="tier",
            new_name="tier_old",
        ),

        # ── 4. FeatureCatalog: add FK tier_new ─────────────────────────────
        migrations.AddField(
            model_name="featurecatalog",
            name="tier_new",
            field=models.ForeignKey(
                blank=True,
                help_text="Minimum plan tier required for this feature.",
                null=True,
                on_delete=django.db.models.deletion.SET_NULL,
                related_name="features",
                to="platform_modules.tier",
                verbose_name="tier",
            ),
        ),

        # ── 5. FeatureCatalog: backfill FK from text ───────────────────────
        migrations.RunPython(_backfill_feature_catalog_tier, migrations.RunPython.noop),

        # ── 6. FeatureCatalog: drop tier_old, rename tier_new → tier ───────
        migrations.RemoveField(
            model_name="featurecatalog",
            name="tier_old",
        ),
        migrations.RenameField(
            model_name="featurecatalog",
            old_name="tier_new",
            new_name="tier",
        ),

        # ── 7. ModuleCatalog: rename old tier → tier_old ───────────────────
        migrations.RenameField(
            model_name="modulecatalog",
            old_name="tier",
            new_name="tier_old",
        ),

        # ── 8. ModuleCatalog: add FK tier_new ──────────────────────────────
        migrations.AddField(
            model_name="modulecatalog",
            name="tier_new",
            field=models.ForeignKey(
                blank=True,
                help_text="Minimum plan tier for this module.",
                null=True,
                on_delete=django.db.models.deletion.SET_NULL,
                related_name="module_catalog_entries",
                to="platform_modules.tier",
                verbose_name="tier",
            ),
        ),

        # ── 9. ModuleCatalog: backfill FK from text ────────────────────────
        migrations.RunPython(_backfill_module_catalog_tier, migrations.RunPython.noop),

        # ── 10. ModuleCatalog: drop tier_old, rename tier_new → tier ───────
        migrations.RemoveField(
            model_name="modulecatalog",
            name="tier_old",
        ),
        migrations.RenameField(
            model_name="modulecatalog",
            old_name="tier_new",
            new_name="tier",
        ),
    ]
