<?php

use App\Models\System\Config;
use App\Services\System\Settings;
use Illuminate\Database\Migrations\Migration;

/**
 * Los parámetros del SCSS-CDN, que estaban escritos en el código.
 *
 * **Los tres vienen con el valor que llevaba funcionando**, así que desplegar esto no
 * cambia el comportamiento de nadie: solo hace visible y editable lo que antes había que
 * ir a buscar a una constante.
 *
 * | Ajuste | De fábrica | Dónde estaba |
 * |---|---|---|
 * | Tope del ZIP | 50 MB | `LimiteDeSubida::ZIP_KB` **y** `ScssCdnZipService::MAX_FILE_SIZE` |
 * | URL firmada para el plugin | 3600 s | `ScssCdnUrlService::API_EXPIRATION_HOURS` |
 * | URL firmada del panel | 365 días | `ScssCdnUrlService::DEFAULT_EXPIRATION_HOURS` |
 *
 * **El tope del ZIP estaba escrito dos veces**, con el mismo 50 en la validación del
 * formulario y en el servicio que abre el fichero. Es el patrón que ya se pagó con los
 * límites de subida (PRODSECU-156): uno cambia, el otro no, y la pantalla anuncia un tope
 * que el servidor no respeta. Ahora los dos leen el ajuste.
 *
 * **Y la de 365 días es la que conviene mirar.** No afecta a los clientes —lo que reciben
 * son URLs de una hora, generadas de nuevo en cada petición— sino solo al enlace que se
 * pinta en la ficha del bundle y en el editor, para inspeccionar el contenido. Un enlace
 * copiado de un pantallazo da acceso a ese fichero durante un año sin necesidad de tener
 * sesión. Se deja en 365 para no cambiar nada al desplegar, pero bajarlo no rompe nada.
 */
return new class extends Migration
{
    /**
     * @var array<string, array{nombre: string, desc: string, valor: string}>
     */
    private function ajustes(): array
    {
        return [
            Settings::SCSSCDN_ZIP_MB => [
                'nombre' => 'SCSS-CDN → Tamaño máximo del ZIP (MB)',
                'desc' => 'Tope del ZIP de un bundle SCSS-CDN, en megabytes. Lo leen las dos '
                    . 'comprobaciones: la validación del formulario y el servicio que abre el '
                    . 'fichero. Sigue por debajo de lo que permita el PHP de la máquina.',
                'valor' => '50',
            ],
            Settings::SCSSCDN_URL_API_SEGUNDOS => [
                'nombre' => 'SCSS-CDN → Vida de la dirección firmada del plugin (segundos)',
                'desc' => 'Cuánto vive la dirección firmada que sustituye a cada @import en la '
                    . 'respuesta de la API. Tiene que cubrir el tiempo entre que se sirve el punto '
                    . 'de entrada y que el Moodle del cliente sigue cada import al compilar. Si '
                    . 'caduca en medio, ese sitio se queda sin parte de los estilos y no falla '
                    . 'nada visible: su theme tira de la caché.',
                'valor' => '3600',
            ],
            Settings::SCSSCDN_URL_PANEL_DIAS => [
                'nombre' => 'SCSS-CDN → Vida de la dirección firmada del panel (días)',
                'desc' => 'Cuánto vive el enlace que se enseña en la ficha del bundle y en el '
                    . 'editor de un fichero, que están para inspeccionar el contenido. No afecta a '
                    . 'lo que reciben los clientes. Un enlace copiado sigue funcionando todo este '
                    . 'tiempo sin necesidad de tener sesión.',
                'valor' => '365',
            ],
        ];
    }

    public function up(): void
    {
        foreach ($this->ajustes() as $clave => $ajuste) {
            Config::updateOrCreate(
                [
                    'model' => Settings::AMBITO,
                    'model_id' => '0',
                    'shortname' => $clave,
                ],
                [
                    'name' => $ajuste['nombre'],
                    'type' => 'text',
                    'mode' => 'wr',
                    'permission' => 'admin.configs.edit',
                    'desc' => $ajuste['desc'],
                    // **Si la fila ya existe, se respeta su valor.** Volver a pasar la
                    // migración no debe devolver un ajuste tocado a su valor de fábrica: es
                    // el mismo criterio que en las otras migraciones de ajustes.
                    'value' => Config::where('model', Settings::AMBITO)
                        ->where('shortname', $clave)
                        ->value('value') ?? $ajuste['valor'],
                ]
            );
        }

        app(Settings::class)->olvidar();
    }

    /**
     * Se borran las tres filas.
     *
     * Deshacer esto **no cambia comportamiento**: sin fila, cada lector usa su valor por
     * defecto, que es el mismo que siembra la migración.
     */
    public function down(): void
    {
        Config::where('model', Settings::AMBITO)
            ->whereIn('shortname', array_keys($this->ajustes()))
            ->delete();

        app(Settings::class)->olvidar();
    }
};
