from django.db import migrations, models
from django.utils import timezone


def _normalize_supplier_name(value):
    return " ".join(str(value or "").split()).strip().upper()


def backfill_supplier_directory(apps, schema_editor):
    VerificationInvoice = apps.get_model("verification", "VerificationInvoice")
    SupplierDirectory = apps.get_model("verification", "SupplierDirectory")

    entries = {}
    invoices = VerificationInvoice.objects.filter(claim__status="submitted").select_related("claim")

    for invoice in invoices.iterator():
        supplier_name = " ".join(str(invoice.supplier_name or "").split()).strip()
        supplier_trn = str(invoice.supplier_trn or "").strip()
        normalized_name = _normalize_supplier_name(supplier_name)
        if not supplier_name and not supplier_trn:
            continue

        key = (normalized_name, supplier_trn)
        current_entry = entries.get(key)
        last_used_at = getattr(invoice, "updated_at", None) or timezone.now()

        if current_entry is None:
            entries[key] = {
                "supplier_name": supplier_name,
                "normalized_name": normalized_name,
                "supplier_trn": supplier_trn,
                "usage_count": 1,
                "last_used_at": last_used_at,
            }
            continue

        current_entry["usage_count"] += 1
        if last_used_at and last_used_at > current_entry["last_used_at"]:
            current_entry["last_used_at"] = last_used_at
        if supplier_name:
            current_entry["supplier_name"] = supplier_name

    SupplierDirectory.objects.bulk_create(
        [
            SupplierDirectory(
                supplier_name=value["supplier_name"],
                normalized_name=value["normalized_name"],
                supplier_trn=value["supplier_trn"],
                usage_count=value["usage_count"],
                last_used_at=value["last_used_at"],
            )
            for value in entries.values()
        ],
        batch_size=500,
    )


class Migration(migrations.Migration):

    dependencies = [
        ("verification", "0007_verificationclaim_autosave_snapshot_and_more"),
    ]

    operations = [
        migrations.CreateModel(
            name="SupplierDirectory",
            fields=[
                ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
                ("created_at", models.DateTimeField(auto_now_add=True)),
                ("updated_at", models.DateTimeField(auto_now=True)),
                ("supplier_name", models.CharField(blank=True, default="", max_length=255)),
                ("normalized_name", models.CharField(blank=True, default="", max_length=255)),
                ("supplier_trn", models.CharField(blank=True, default="", max_length=32)),
                ("usage_count", models.PositiveIntegerField(default=1)),
                ("last_used_at", models.DateTimeField(default=timezone.now)),
            ],
            options={
                "ordering": ["-last_used_at", "-usage_count", "supplier_name", "supplier_trn"],
                "indexes": [
                    models.Index(fields=["normalized_name"], name="verification_normali_53e9dc_idx"),
                    models.Index(fields=["supplier_trn"], name="verification_supplie_4f7a6b_idx"),
                    models.Index(fields=["last_used_at"], name="verification_last_us_9bbcad_idx"),
                ],
            },
        ),
        migrations.AddConstraint(
            model_name="supplierdirectory",
            constraint=models.UniqueConstraint(fields=("normalized_name", "supplier_trn"), name="verification_unique_supplier_directory_entry"),
        ),
        migrations.RunPython(backfill_supplier_directory, migrations.RunPython.noop),
    ]
