<?php

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

/**
 * Índices compuestos para el visor de logs.
 *
 * La tabla ya tenía índice en casi todas las columnas que se filtran, pero **todos
 * de una sola columna**. El visor consulta siempre por rango de fechas MÁS otra
 * condición (`WHERE started_at BETWEEN … AND http_status BETWEEN 400 AND 499`, o
 * agrupando por cliente dentro del rango), y con índices de una columna el motor
 * solo puede aprovechar uno: el resto lo resuelve examinando filas. En producción,
 * un `GROUP BY` por minuto e IP tardó **21,8 segundos**.
 *
 * Ver known-issues MGR-027.
 *
 * OJO AL DESPLIEGUE: crear índices en una tabla grande tarda y consume E/S. MySQL y
 * MariaDB lo hacen sin bloquear escrituras (`ALGORITHM=INPLACE`), pero conviene
 * lanzarlo en una ventana de poca carga. Si la tabla es enorme, purgar antes con
 * `php artisan api-logs:purge --days=90` hace que esto sea mucho más rápido.
 */
return new class extends Migration
{
    public function up(): void
    {
        Schema::table('api_request_logs', function (Blueprint $table) {
            // Los indicadores del visor: total, 4xx y 5xx dentro de un rango.
            $table->index(['started_at', 'http_status'], 'api_logs_started_status_idx');

            // Filtros y agrupaciones por cliente y por entorno dentro del rango.
            $table->index(['client_id', 'started_at'], 'api_logs_client_started_idx');
            $table->index(['environment_id', 'started_at'], 'api_logs_env_started_idx');

            // Percentiles de duración dentro del rango.
            $table->index(['started_at', 'duration_ms'], 'api_logs_started_duration_idx');
        });
    }

    public function down(): void
    {
        Schema::table('api_request_logs', function (Blueprint $table) {
            $table->dropIndex('api_logs_started_status_idx');
            $table->dropIndex('api_logs_client_started_idx');
            $table->dropIndex('api_logs_env_started_idx');
            $table->dropIndex('api_logs_started_duration_idx');
        });
    }
};
