from django.db import migrations


def get_device_scale_id(device):
    if not device:
        return None

    value = getattr(device, "scale_id_id", None)
    if value:
        return value

    return getattr(device, "scale_id", None)


def forwards(apps, schema_editor):
    Result = apps.get_model("results", "Result")
    ScaleCropMapping = apps.get_model("scalemanagement", "ScaleCropMapping")

    updated = 0
    skipped_existing = 0
    skipped_no_crop = 0
    skipped_no_device = 0
    skipped_no_scale = 0
    no_match = []
    ambiguous = []

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

    for result in qs.iterator():
        if result.scale_number_id:
            skipped_existing += 1
            continue

        if not result.crop_id:
            skipped_no_crop += 1
            continue

        device = getattr(result, "device", None)
        if not device:
            skipped_no_device += 1
            continue

        scale_id = get_device_scale_id(device)
        if not scale_id:
            skipped_no_scale += 1
            continue

        mappings = list(
            ScaleCropMapping.objects.filter(
                crop_id=result.crop_id,
                scale_id=scale_id,
            ).values("scale_order_number")
        )

        if len(mappings) == 1:
            result.scale_number_id = mappings[0]["scale_order_number"]
            result.save(update_fields=["scale_number_id"])
            updated += 1

        elif len(mappings) > 1:
            ambiguous.append(
                f"Result {result.id}: multiple mappings for crop_id={result.crop_id}, scale_id={scale_id}"
            )

        else:
            no_match.append(
                f"Result {result.id}: no mapping for crop_id={result.crop_id}, scale_id={scale_id}"
            )

    print("Result scale_number migration summary")
    print(f"Updated: {updated}")
    print(f"Skipped existing: {skipped_existing}")
    print(f"Skipped no crop: {skipped_no_crop}")
    print(f"Skipped no device: {skipped_no_device}")
    print(f"Skipped no scale: {skipped_no_scale}")
    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")

    Result.objects.exclude(scale_number_id=None).update(
        scale_number_id=None
    )


class Migration(migrations.Migration):

    dependencies = [
        ("results", "0020_auto_20260427_0852")
    ]

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