<?php

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

/**
 * El versiondb del core, que llegaba en cada sync y se tiraba.
 *
 * **El hallazgo.** El contrato de la API dice que el sitio manda las dos cosas:
 *
 * ```json
 * "site": {
 *     "version": "2025100601.03",              // el versiondb del core
 *     "release":  "5.1.1+ (Build: 20251219)"    // la release legible
 * }
 * ```
 *
 * `SyncAction` lee `release` y **nunca lee `version`**. O sea que el número exacto del
 * código que tiene puesto cada Moodle llega en cada sincronización y se descarta, y en
 * el panel no se puede enseñar porque no está guardado en ninguna parte.
 *
 * **Y por qué se notó.** En el dashboard, «Entornos por versión de Moodle» salía con
 * filas como `Moodle 2025100606` y `Moodle 2025100605.02`. Eso no era el versiondb bien
 * guardado: era la columna `version` arrastrando lo que dejó el Manager antiguo en
 * entornos que no han vuelto a sincronizar —uno de ellos lleva 123 días sin señal—.
 * `SyncAction` sobrescribe `version` con la release **solo si `release` viene en el
 * payload**, así que en los sitios con el plugin sin actualizar se queda el valor viejo.
 *
 * De ahí que la misma columna contenga dos cosas distintas según cuándo se escribió por
 * última vez, y que la agrupación del dashboard se inventara cinco «ramas» que no
 * existen. Con el versiondb en su propia columna, `version` vuelve a significar una sola
 * cosa —la release— y el número exacto tiene su sitio.
 *
 * No hay relleno: el valor llega en el siguiente sync de cada entorno. Los que no
 * sincronicen se quedan a null, que es la verdad —no sabemos su versiondb— y es lo que
 * las pantallas dicen en lugar de inventarlo.
 */
return new class extends Migration
{
    public function up(): void
    {
        if (Schema::hasColumn('environments', 'versiondb')) {
            return;
        }

        Schema::table('environments', function (Blueprint $table) {
            // 20 y no 10: el formato es `YYYYMMDDXX` pero llega con decimal
            // —`2025100601.03`— porque en Moodle `$version` es un float y el `.03` es el
            // incremento dentro del día. Se guarda como texto y no como número porque
            // `2025100601.03` en un float pierde precisión, y porque nunca se hace
            // aritmética con él: se muestra y se compara como cadena.
            $table->string('versiondb', 20)->nullable()->after('version');
        });
    }

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