<?php

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

/**
 * Ajustes del aviso de soportes que caducan.
 *
 * Recupera el `support:expires` del Manager antiguo, que era el segundo de los dos
 * avisos automáticos que se perdieron en la migración. Allí los umbrales
 * (`support:expires:days` = `0,7,15,30`) y el destinatario (`support_email` =
 * `help@tresipunt.com`) también se configuraban desde el panel; esto es lo mismo con las
 * claves del ámbito nuevo.
 *
 * **El destinatario nace vacío y eso NO significa que no se envíe**: si está vacío se
 * usan los destinatarios de los avisos de licencias. Un ajuste más que empieza en blanco
 * es un aviso más que parece configurado y no llega a nadie; quien quiera separar Soporte
 * de Comercial pone aquí sus direcciones.
 */
return new class extends Migration
{
    /**
     * @return array<string, array{0: string, 1: string, 2: string, 3: string}>
     */
    private function claves(): array
    {
        return [
            Settings::SOPORTES_ACTIVO => [
                'Soportes → Avisar de los que caducan',
                'checkbox',
                '1',
                'Aviso por correo de los soportes de entorno que están por caducar. No desactiva '
                    . 'ni cambia nada: solo avisa.',
            ],
            Settings::SOPORTES_EMAIL => [
                'Soportes → Destinatarios',
                'text',
                '',
                'Direcciones separadas por comas. Si se deja vacío se usan los destinatarios de '
                    . 'los avisos de licencias.',
            ],
            Settings::SOPORTES_DIAS => [
                'Soportes → Días de aviso',
                'text',
                // Los mismos que el Manager antiguo, en el orden en que se avisan.
                '30,15,7,0',
                'Días de antelación a los que se avisa, separados por comas. El 0 es el día de la '
                    . 'caducidad. Un soporte se renueva con negociación, así que un único aviso a '
                    . 'pocos días llega tarde.',
            ],
        ];
    }

    public function up(): void
    {
        foreach ($this->claves() as $clave => [$nombre, $tipo, $porDefecto, $descripcion]) {
            Config::updateOrCreate(
                [
                    'model' => Settings::AMBITO,
                    'model_id' => '0',
                    'shortname' => $clave,
                ],
                [
                    'name' => $nombre,
                    'type' => $tipo,
                    'mode' => 'wr',
                    'permission' => 'admin.configs.edit',
                    'desc' => $descripcion,
                    // Nunca se pisa un valor ya decidido en producción.
                    'value' => Config::where('model', Settings::AMBITO)
                        ->where('shortname', $clave)
                        ->value('value') ?? $porDefecto,
                ]
            );
        }
    }

    public function down(): void
    {
        Config::whereIn('shortname', array_keys($this->claves()))->forceDelete();
    }
};
