<?php

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

/**
 * El cuerpo de la respuesta, **solo cuando algo ha ido mal**.
 *
 * **Lo que había.** El logger lee la respuesta, le saca el `code` y el `error`, mide su
 * tamaño… y **descarta el cuerpo**. Así que el detalle de una petición no podía enseñar
 * qué se le respondió al cliente: no estaba en ninguna parte. Y cuando el cuerpo no es un
 * JSON con la forma esperada —una excepción que devuelve HTML, un 502 de un proxy—, no
 * queda absolutamente nada de lo que pasó.
 *
 * **Por qué solo las que no son correctas.** `api_request_logs` es la tabla que más crece
 * del sistema, y las respuestas correctas son justo las grandes: `scss`, `js`, `setup` y
 * `scss-cdn` devuelven ficheros y bundles. Guardarlas todas multiplicaría el tamaño de la
 * tabla por el peso del contenido servido, para un dato que casi nunca se mira: cuando la
 * respuesta es correcta, lo que hay que saber ya está en `response_size`.
 *
 * Las que fallan son lo contrario: un JSON de dos líneas, el 12 % de las filas, y **es el
 * único sitio donde el cuerpo tiene valor de diagnóstico**.
 *
 * La condición se escribe en el logger como `http_status >= 400`, que es **exactamente**
 * la definición de «no correcta» de `Severidad::de()`: ahí, todo lo que baja de 400
 * devuelve `ok` antes de mirar nada más.
 *
 * **Y con tope.** 2 KB por respuesta, cortando por carácter y no por byte para no partir
 * un UTF-8 por la mitad. Un error de la API cabe de sobra; lo que no cabe es una traza de
 * PHP entera, y tampoco hace falta —para eso está `laravel.log`—.
 *
 * No lleva índice: no se filtra por el cuerpo, se lee cuando ya has abierto una petición.
 */
return new class extends Migration
{
    public function up(): void
    {
        if (Schema::hasColumn('api_request_logs', 'response_body')) {
            return;
        }

        Schema::table('api_request_logs', function (Blueprint $table) {
            // `text` y no `string`: el tope lo pone el logger, y una columna de longitud
            // fija obligaría a cambiar el esquema para cambiar el tope.
            $table->text('response_body')->nullable();
        });
    }

    public function down(): void
    {
        Schema::table('api_request_logs', function (Blueprint $table) {
            $table->dropColumn('response_body');
        });
    }
};
