"""
Calcula el puntaje de prioridad de las URLs que ya tienen estado (T083).

El puntaje se escribe en cada inspección, así que sin esta migración se llenaría
solo… en el próximo ciclo completo, que sobre un sitio grande son días. Mientras
tanto todas las URLs valdrían cero y el criterio «las problemáticas antes que las
estables» seguiría existiendo escrito y sin aplicarse, que es exactamente el
estado del que se viene.

El puntaje es una función del estado, así que recalcularlo no pierde nada: se
deriva de lo último que Google contestó, que ya está guardado. La vuelta atrás
los pone en cero, que es el valor con el que nacieron.

Se escribe con `update()` por estado —diez consultas— y no fila por fila: la
tabla de URLs es la más grande del producto y una consulta por fila sobre cien
mil filas tarda lo suficiente como para que alguien corte el despliegue a la
mitad.
"""

from django.db import migrations

#: La misma tabla que `apps/coverage/services.py::PRIORITY_BY_STATE`.
#:
#: Se copia y no se importa: una migración describe lo que hizo el día que
#: corrió, y si mañana cambian los puntajes esta migración tiene que seguir
#: aplicando los de hoy. Importar el módulo la haría cambiar de significado
#: retroactivamente.
PRIORITY_BY_STATE = {
    'FETCH_ERROR': 40,
    'CRAWLED_NOT_INDEXED': 30,
    'DISCOVERED_NOT_INDEXED': 30,
    'OTHER_NOT_INDEXED': 25,
    'DUPLICATE_CANONICAL': 15,
    'REDIRECT': 15,
    'BLOCKED_ROBOTS': 10,
    'EXCLUDED_NOINDEX': 10,
    'INDEXED': 0,
    'UNKNOWN': 0,
}


def score_from_state(apps, _schema_editor):
    Url = apps.get_model('sitemaps', 'Url')

    for state, score in PRIORITY_BY_STATE.items():
        Url.objects.filter(coverage_state=state).exclude(priority_score=score).update(
            priority_score=score
        )


def back_to_zero(apps, _schema_editor):
    Url = apps.get_model('sitemaps', 'Url')
    Url.objects.exclude(priority_score=0).update(priority_score=0)


class Migration(migrations.Migration):
    dependencies = [('sitemaps', '0003_remove_sitemap_un_sitemap_por_ubicacion_y_dominio_and_more')]

    operations = [migrations.RunPython(score_from_state, back_to_zero)]
