<?php

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

/**
 * `api_rate_events.license_token_id`: qué licencia ha alcanzado su límite.
 *
 * La tabla se creó para el límite por IP (MGR-008). El Manager tiene además un
 * **segundo** límite, por token y configurable en cada licencia
 * (`license_tokens.rate_limit_per_minute`), y ese no registraba nada: cortaba con un
 * 429 y no quedaba rastro en ninguna parte. O sea que la única forma de enterarse era
 * que el cliente llamara.
 *
 * Con esta columna los dos límites escriben en la misma tabla, así que aparecen en el
 * mismo sitio del Dashboard y en el mismo visor. Ver known-issues MGR-013.
 *
 * **La clave única no se toca, y es a propósito.** Es
 * `(ip, window_started_at, limit_kind)`, y añadirle una columna que admite nulos
 * rompería el agrupado de los eventos por IP: en MariaDB un índice único permite
 * varios nulos, así que las filas de límite por IP —que llevarían
 * `license_token_id` nulo— dejarían de agruparse y volveríamos a tener mil filas por
 * minuto.
 *
 * Efecto secundario aceptado: dos tokens distintos que se pasen **en el mismo minuto y
 * desde la misma IP** comparten fila. Es instrumentación de diagnóstico y ese caso
 * pide un proxy compartido con dos licencias saturadas a la vez; si algún día pasa,
 * la salida es una tabla propia, no forzar esta.
 */
return new class extends Migration
{
    public function up(): void
    {
        Schema::table('api_rate_events', function (Blueprint $table) {
            $table->foreignId('license_token_id')
                ->nullable()
                ->after('ip')
                ->constrained('license_tokens')
                ->nullOnDelete()
                ->cascadeOnUpdate();
        });
    }

    public function down(): void
    {
        Schema::table('api_rate_events', function (Blueprint $table) {
            $table->dropConstrainedForeignId('license_token_id');
        });
    }
};
