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(fund_code__isnull=True).values_list("fund_code", flat=True))
    for fund in ProjectFund.objects.filter(fund_code__isnull=True):
        while True:
            code = "".join(secrets.choice(ALPHABET) for _ in range(7))
            if code not in used:
                used.add(code)
                break
        fund.fund_code = code
        fund.save(update_fields=["fund_code"])


def reverse(apps, schema_editor):
    ProjectFund = apps.get_model("projects", "ProjectFund")
    ProjectFund.objects.update(fund_code=None)


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