"""
Los avisos dejan de guardar su frase y pasan a guardar sus datos.

Un aviso escrito quedaba atado al idioma que tenía la cuenta el día que ocurrió.
La lista de avisos es larga y vieja: sin esto, una cuenta que cambia a inglés se
queda con un historial mitad en un idioma y mitad en el otro, y ninguno de los
dos se puede leer entero.

**Los avisos que ya existen conservan exactamente su texto.** Se mueven a
`params` bajo la clave `LEGACY`, que el catálogo dibuja tal cual llegó. Es la
única forma honesta de migrarlos: de una frase ya escrita no se pueden recuperar
los datos que la compusieron —cuántas URLs, con qué cifras cerró el lote— y
adivinarlos sería reescribir el historial. Los avisos nuevos nacen con su clave
y sus datos.

La vuelta atrás recompone el texto desde `params`, así que un `migrate` en las
dos direcciones no pierde nada de lo que había antes de la ida.
"""

from django.db import migrations, models


def text_into_params(apps, schema_editor):
    """Mueve el texto escrito a `params`, sin interpretarlo."""
    Notification = apps.get_model('notifications', 'Notification')

    for notification in Notification.objects.all().iterator():
        notification.text_key = 'LEGACY'
        notification.params = {
            'title': notification.title,
            'body': notification.body,
            'action': notification.action_label,
        }
        notification.save(update_fields=['text_key', 'params'])


def params_into_text(apps, schema_editor):
    """
    Devuelve el texto a sus columnas.

    Los avisos que nacieron después de la ida no tienen frase escrita: se les
    deja el título vacío antes que inventarles uno, porque la columna vieja no
    admite el `text_key` que sí los explica.
    """
    Notification = apps.get_model('notifications', 'Notification')

    for notification in Notification.objects.all().iterator():
        params = notification.params or {}
        notification.title = params.get('title', '')
        notification.body = params.get('body', '')
        notification.action_label = params.get('action', '')
        notification.save(update_fields=['title', 'body', 'action_label'])


class Migration(migrations.Migration):
    dependencies = [
        ('notifications', '0005_alter_notification_level'),
    ]

    operations = [
        # Primero los campos nuevos, después el traspaso, y recién entonces se
        # borran los viejos: al revés, el texto se perdería antes de copiarlo.
        migrations.AddField(
            model_name='notification',
            name='params',
            field=models.JSONField(blank=True, default=dict),
        ),
        migrations.AddField(
            model_name='notification',
            name='text_key',
            field=models.CharField(default='LEGACY', max_length=40),
        ),
        migrations.RunPython(text_into_params, params_into_text),
        migrations.RemoveField(model_name='notification', name='action_label'),
        migrations.RemoveField(model_name='notification', name='body'),
        migrations.RemoveField(model_name='notification', name='title'),
    ]
