<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;

/**
 * Recompone el índice parcial del dominio en los motores que no son MySQL.
 *
 * **Qué pasó.** `relax_environments_domain_unique_for_local` dejó el dominio único solo
 * entre entornos **no locales** (fixes/PRODSECU-192: varios desarrolladores comparten
 * `moodle.test`). En MySQL lo hace con una columna generada; en el resto de motores con
 * un índice parcial:
 *
 * ```sql
 * CREATE UNIQUE INDEX environments_domain_unique ON environments (domain) WHERE env <> 'local'
 * ```
 *
 * Después, `encrypt_environments_moodletoken` hizo un `->change()` sobre la tabla. Y en
 * **sqlite un `change()` reconstruye la tabla entera**: Laravel copia los datos a una
 * tabla nueva y recrea los índices a partir de lo que sabe de ellos… **perdiendo la
 * cláusula `WHERE`**. El índice quedó como un unique normal.
 *
 * Comprobado tras todas las migraciones:
 * `CREATE UNIQUE INDEX "environments_domain_unique" on "environments" ("domain")`.
 *
 * **Consecuencia**: en producción (MariaDB) el comportamiento seguía siendo el correcto,
 * pero **la suite de tests corre sobre sqlite** y ahí la regla era más estricta que la
 * real. O sea: los tests no podían comprobar el comportamiento documentado, y cualquier
 * prueba de entornos locales duplicados fallaba por un motivo que no existe en producción.
 *
 * Se arregla aquí y no editando la migración del cifrado a propósito: esa ya se ha
 * ejecutado, y una migración aplicada no se toca.
 */
return new class extends Migration
{
    public function up(): void
    {
        if (DB::getDriverName() === 'mysql') {
            // Ahí manda la columna generada `domain_unique`, y un `change()` en MySQL es
            // un ALTER de verdad: no se pierde nada.
            return;
        }

        DB::statement('DROP INDEX IF EXISTS environments_domain_unique');
        DB::statement("
            CREATE UNIQUE INDEX environments_domain_unique
            ON environments (domain)
            WHERE env <> 'local'
        ");
    }

    public function down(): void
    {
        if (DB::getDriverName() === 'mysql') {
            return;
        }

        // Se deja el índice parcial: volver al unique total sería recuperar el estado
        // roto a propósito.
    }
};
