import secrets

from django.db import migrations

ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"


def backfill(apps, schema_editor):
    ProjectFund = apps.get_model("projects", "ProjectFund")
    used = set(ProjectFund.objects.exclude(grant_number="").values_list("grant_number", flat=True))
    for fund in ProjectFund.objects.filter(grant_number=""):
        while True:
            code = "GR-" + "".join(secrets.choice(ALPHABET) for _ in range(7))
            if code not in used:
                used.add(code)
                break
        fund.grant_number = code
        fund.save(update_fields=["grant_number"])


def reverse(apps, schema_editor):
    # Generated numbers are indistinguishable from staff-entered GR- codes;
    # leave them in place on rollback.
    pass


class Migration(migrations.Migration):
    dependencies = [("projects", "0031_backfill_fund_codes")]
    operations = [migrations.RunPython(backfill, reverse)]
