from django.db import migrations


def normalize_value(value):
    return (value or "").strip().lower()


def forwards(apps, schema_editor):
    Result = apps.get_model("results", "Result")
    CropTranslation = apps.get_model("cropmanagement", "CropTranslation")

    updated_count = 0
    skipped_empty = 0
    no_device_language = 0
    no_match = []
    ambiguous = []

    qs = Result.objects.select_related("device").all()

    for result in qs.iterator():
        if result.crop_id:
            continue

        crop_type = normalize_value(result.crop_type)

        if not crop_type:
            skipped_empty += 1
            continue

        device = getattr(result, "device", None)
        language_id = getattr(device, "language_id_id", None)

        if not language_id:
            no_device_language += 1
            no_match.append(
                f"Result {result.id}: device language missing, crop_type='{result.crop_type}'"
            )
            continue

        matches = list(
            CropTranslation.objects.filter(
                language_id=language_id
            )
            .values("crop_id", "name")
        )

        matched_crops = [
            item for item in matches
            if normalize_value(item["name"]) == crop_type
        ]

        if len(matched_crops) == 1:
            result.crop_id = matched_crops[0]["crop_id"]
            result.save(update_fields=["crop"])
            updated_count += 1

        elif len(matched_crops) > 1:
            ambiguous.append(
                f"Result {result.id}: multiple crop matches for crop_type='{result.crop_type}', "
                f"language_id={language_id}"
            )

        else:
            no_match.append(
                f"Result {result.id}: no crop match for crop_type='{result.crop_type}', "
                f"language_id={language_id}"
            )

    print("Result crop migration summary")
    print(f"Updated: {updated_count}")
    print(f"Skipped empty crop_type: {skipped_empty}")
    print(f"No device language: {no_device_language}")
    print(f"No match: {len(no_match)}")
    print(f"Ambiguous: {len(ambiguous)}")

    for item in no_match[:50]:
        print(item)

    for item in ambiguous[:50]:
        print(item)


def backwards(apps, schema_editor):
    Result = apps.get_model("results", "Result")

    for result in Result.objects.exclude(crop_id=None).iterator():
        result.crop_id = None
        result.save(update_fields=["crop"])


class Migration(migrations.Migration):

    dependencies = [
        ('results', '0018_result_crop_alter_result_crop_type'),
    ]

    operations = [
        migrations.RunPython(forwards, backwards),
    ]
