from django.db import migrations, models


def move_unique_id_to_shipment(apps, schema_editor):
    Shipment = apps.get_model('core', 'Shipment')
    Trip = apps.get_model('core', 'Trip')

    for trip in Trip.objects.exclude(unique_id__isnull=True).exclude(unique_id='').iterator():
        shipment = Shipment.objects.filter(pk=trip.shipment_id).first()
        if shipment and not shipment.unique_id:
            shipment.unique_id = trip.unique_id
            shipment.save(update_fields=['unique_id'])

    prefix = 'SH-'
    prefix_len = len(prefix)
    max_seq = 0
    for uid in Shipment.objects.exclude(unique_id__isnull=True).exclude(unique_id='').values_list('unique_id', flat=True):
        if uid.startswith(prefix):
            suffix = uid[prefix_len:]
            if suffix.isdigit():
                max_seq = max(max_seq, int(suffix))

    for shipment in Shipment.objects.filter(unique_id__isnull=True).order_by('id').iterator():
        max_seq += 1
        shipment.unique_id = f'{prefix}{max_seq:05d}'
        shipment.save(update_fields=['unique_id'])


class Migration(migrations.Migration):

    dependencies = [
        ('core', '0021_trip_unique_id_nullable'),
    ]

    operations = [
        migrations.AddField(
            model_name='shipment',
            name='unique_id',
            field=models.CharField(blank=True, editable=False, max_length=12, null=True, unique=True),
        ),
        migrations.RunPython(move_unique_id_to_shipment, migrations.RunPython.noop),
        migrations.RemoveField(
            model_name='trip',
            name='unique_id',
        ),
    ]
