<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

/**
 * `api_blocks.enforced`: ¿se cortó de verdad, o solo se observó?
 *
 * **El modo observación.** Al subir esto a producción los límites no deben cortar a
 * nadie: los umbrales están puestos a ojo —20 fallos y 600 peticiones por minuto se
 * eligieron a partir de un único incidente— y el primer día no se sabe cómo es el
 * tráfico real de 200 entornos. Cortar con un número inventado significa dejar sin
 * servicio a un cliente legítimo.
 *
 * Así que se despliega **midiendo**: los contadores cuentan, las incidencias se
 * registran y los avisos se envían, pero **la petición sigue adelante**. Con unas
 * semanas de datos delante se ajustan los números desde el panel y entonces se activa
 * el corte.
 *
 * Esta columna distingue las dos cosas en la misma fila:
 *
 *   enforced = 1   se rechazó la petición (429)
 *   enforced = 0   se habría rechazado, pero se dejó pasar
 *
 * Sin esta distinción, la lista de bloqueos mentiría en modo observación: diría
 * "bloqueado" de sitios que están funcionando con normalidad.
 */
return new class extends Migration
{
    public function up(): void
    {
        Schema::table('api_blocks', function (Blueprint $table) {
            // Por defecto `false`: el valor seguro. Si algún día se lee una fila
            // antigua sin este dato, se interpreta como observación y no como corte.
            $table->boolean('enforced')->default(false)->after('state');
            $table->index(['enforced', 'state']);
        });
    }

    public function down(): void
    {
        Schema::table('api_blocks', function (Blueprint $table) {
            $table->dropIndex(['enforced', 'state']);
            $table->dropColumn('enforced');
        });
    }
};
