"""
Activa las cuentas que ya tenian claves funcionando.

`Account.active` nace con `default=False` y hasta ahora **no se comprobaba en
ningun punto de la autenticacion**: una cuenta marcada como inactiva seguia
enviando igual. Es decir, el valor que hay hoy en esa columna no refleja
ninguna decision: la mayoria de cuentas estan a `False` porque nadie las puso
a `True`, no porque alguien quisiera cerrarles el paso.

A partir de ahora si se comprueba. Sin este paso, el despliegue cortaria el
acceso a todos los clientes cuya cuenta nunca se activo a mano —es decir,
probablemente a todos—.

Se activan solo las cuentas que tienen al menos una clave usable (activa y no
revocada). Una cuenta sin claves utiles no gana nada con activarse, y dejarla
como esta es lo mas parecido a no tocar lo que no hace falta.

Revocar una clave sigue siendo la via para cortar el acceso de una credencial
concreta; desactivar la cuenta corta el de todas sus claves a la vez, que es
justo lo que se pretendia y no ocurria.
"""

from django.db import migrations


def activar(apps, schema_editor):
    Account = apps.get_model("authentication", "Account")
    ApiKeys = apps.get_model("keys", "ApiKeys")

    con_claves = (
        ApiKeys.objects.filter(active=True, revoked_at__isnull=True)
        .values_list("account_id", flat=True)
        .distinct()
    )
    activadas = Account.objects.filter(id__in=list(con_claves), active=False).update(
        active=True
    )
    if activadas:
        print(f"  {activadas} cuenta(s) activadas por tener claves en uso.")


def revertir(apps, schema_editor):
    # No se deshace: no hay forma de distinguir las cuentas que activo esta
    # migracion de las que ya estaban activas antes, y apagarlas todas
    # cortaria el servicio. Volver atras es inofensivo de todos modos, porque
    # el codigo anterior no mira este campo.
    pass


class Migration(migrations.Migration):
    dependencies = [
        ("keys", "0007_alcances_de_las_claves_existentes"),
        ("authentication", "0001_initial"),
    ]

    operations = [migrations.RunPython(activar, revertir)]
