"""
Backfill membership_period sur les PaymentReceipt existants en utilisant
la membership_period actuellement assignée à l'utilisateur (best effort).

Les reçus dont l'utilisateur n'a pas de membership_period assignée
restent à NULL — ils devront être corrigés manuellement par un agent
si nécessaire.
"""
from django.db import migrations


def backfill_periods(apps, schema_editor):
    PaymentReceipt = apps.get_model('User', 'PaymentReceipt')
    receipts = PaymentReceipt.objects.filter(
        membership_period__isnull=True,
        user__membership_period__isnull=False,
    ).select_related('user')

    updated = []
    for receipt in receipts.iterator():
        receipt.membership_period_id = receipt.user.membership_period_id
        updated.append(receipt)

    if updated:
        PaymentReceipt.objects.bulk_update(updated, ['membership_period'], batch_size=500)


def reverse_noop(apps, schema_editor):
    # Pas de rollback : on ne peut pas distinguer les reçus backfillés
    # des autres une fois la migration appliquée.
    pass


class Migration(migrations.Migration):

    dependencies = [
        ('User', '0005_paymentreceipt_membership_period'),
    ]

    operations = [
        migrations.RunPython(backfill_periods, reverse_noop),
    ]
