from __future__ import annotations

import re
import unicodedata

from django.db import migrations, models


def _normalize_municipality_name(value):
    text = str(value or "").strip().lower()
    if not text:
        return ""
    text = unicodedata.normalize("NFKD", text)
    text = "".join(char for char in text if not unicodedata.combining(char))
    text = re.sub(r"[\W_]+", " ", text, flags=re.UNICODE)
    return re.sub(r"\s+", " ", text).strip()


def populate_normalized_names(apps, schema_editor):
    IstatMunicipality = apps.get_model("istat", "IstatMunicipality")
    for municipality in IstatMunicipality.objects.all().iterator():
        municipality.normalized_name = _normalize_municipality_name(municipality.name)
        if municipality.province:
            municipality.province = municipality.province.strip().upper()
        municipality.save(update_fields=["normalized_name", "province"])


class Migration(migrations.Migration):
    dependencies = [
        ("istat", "0004_istatcredential_istatauditlog_istatsynchistory"),
    ]

    operations = [
        migrations.AddField(
            model_name="istatmunicipality",
            name="normalized_name",
            field=models.CharField(blank=True, db_index=True, max_length=128),
        ),
        migrations.AddField(
            model_name="istatmunicipality",
            name="is_active",
            field=models.BooleanField(default=True),
        ),
        migrations.RunPython(populate_normalized_names, migrations.RunPython.noop),
        migrations.AddIndex(
            model_name="istatmunicipality",
            index=models.Index(fields=["province"], name="istat_muni_province_idx"),
        ),
        migrations.AddIndex(
            model_name="istatmunicipality",
            index=models.Index(
                fields=["province", "normalized_name"],
                name="istat_muni_prov_name_idx",
            ),
        ),
        migrations.AddIndex(
            model_name="istatmunicipality",
            index=models.Index(fields=["is_active"], name="istat_muni_active_idx"),
        ),
    ]
