<?php

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

/**
 * `data.description` a TEXT, porque un sitio real no cabía en 255 y devolvía un 500.
 *
 * La columna guarda la portada del Moodle tal cual, en HTML, y la escribe `DataAction`
 * con lo que manda el sitio. Dos clientes tenían ahí 382 y 664 caracteres —una bienvenida
 * con negritas y párrafos, nada excepcional— y `varchar(255)` con `STRICT_TRANS_TABLES`
 * no trunca: lanza «Data too long for column», que sube hasta el `catch (\Throwable)` del
 * controlador y sale por la API como «Error interno del servidor». El sitio se veía en
 * rojo en el visor por un fallo que era nuestro.
 *
 * **No lo cogió ningún test y no podía cogerlo**: la suite corre en SQLite, que se apunta
 * la longitud del VARCHAR y luego la ignora. El insert pasa en los tests y revienta en
 * MariaDB. Es el mismo patrón que el `only_full_group_by` del listado de entornos.
 *
 * Van también `imageurl` y `url`: son el mismo caso —texto de fuera, sin control nuestro
 * sobre su largo— y una URL con parámetros pasa de 255 sin ninguna dificultad. El resto de
 * `varchar(255)` de la tabla se quedan como están: `language`, `countrycode`, `privacy` o
 * `regioncode` son códigos de Moodle con forma fija, y ensanchar por si acaso lo que tiene
 * forma conocida solo quita una comprobación que hoy hace la base de datos gratis.
 */
return new class extends Migration
{
    public function up(): void
    {
        Schema::table('data', function (Blueprint $table) {
            $table->text('description')->nullable()->change();
            $table->text('imageurl')->nullable()->change();
            $table->text('url')->nullable()->change();
        });
    }

    public function down(): void
    {
        // Volver a 255 truncaría lo que ya no cabe, así que se trunca a propósito y
        // antes de tocar el tipo: si no, el propio ALTER sería el que fallara con la
        // misma excepción que esta migración vino a quitar.
        foreach (['description', 'imageurl', 'url'] as $columna) {
            \DB::table('data')
                ->whereRaw("CHAR_LENGTH({$columna}) > 255")
                ->update([$columna => \DB::raw("LEFT({$columna}, 255)")]);
        }

        Schema::table('data', function (Blueprint $table) {
            $table->string('description')->nullable()->change();
            $table->string('imageurl')->nullable()->change();
            $table->string('url')->nullable()->change();
        });
    }
};
