<?php

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

/**
 * Los cinco ajustes muertos del Manager antiguo, y el destinatario de soporte perdido
 * dentro de uno de ellos.
 *
 * **El hallazgo.** La tabla `configs` tiene 20 filas en tres ámbitos, y solo uno se usa:
 *
 * | Ámbito | Cuántos | ¿Se editan? | ¿Los lee alguien? |
 * |---|---|---|---|
 * | `manager` | 15 | Sí, en Configuraciones del Manager | Sí |
 * | `role` | 1 | No | **No** |
 * | `task` | 4 | No | **No** |
 *
 * Los cinco de `role` y `task` vienen del Manager antiguo. Solo se citan en comentarios
 * de `CheckSupportExpiry` y `SupportExpiryAlert`; ningún código los lee y ninguna
 * pantalla los edita.
 *
 * **Y dos duplicaban ajustes vivos con valores distintos**: `task/support:expires:days`
 * valía `0,7,15,30` y el vivo `alerts:support:days` vale `30,15,7,0`. Los mismos
 * umbrales en dos filas y en orden distinto: quien abriera la tabla no podía saber cuál
 * manda.
 *
 * **Lo importante, y por lo que esta migración no es solo limpieza.** El ajuste vivo
 * `alerts:support:email` está **vacío**, y la dirección que alguien configuró
 * —`help@tresipunt.com`— está en la fila muerta `role/support_email`. Con el vivo vacío,
 * `Settings::destinatariosDeSoportes()` cae a los destinatarios de licencias, así que
 * **los avisos de soporte se están enviando a Comercial en lugar de a Soporte**. Antes de
 * borrar nada, el valor se copia a donde sí se lee.
 *
 * **Y una credencial.** `task/systems:updates:token` guarda un par `usuario:contraseña`
 * en texto plano. No lo usa nadie, pero una credencial en una tabla de ajustes es una
 * credencial expuesta: se borra, y **su valor no se escribe en ningún log**.
 */
return new class extends Migration
{
    /** Ámbito, clave. */
    private const MUERTOS = [
        ['role', 'support_email'],
        ['task', 'support:expires'],
        ['task', 'support:expires:days'],
        ['task', 'systems:updates'],
        // Guarda una credencial en claro. No se registra su valor en ninguna parte.
        ['task', 'systems:updates:token'],
    ];

    public function up(): void
    {
        // ============ 1. Rescatar el destinatario de soporte ============
        // Solo si el vivo está vacío: si alguien ya lo ha configurado, manda el suyo.
        $vivo = Config::where('model', Settings::AMBITO)
            ->where('shortname', Settings::SOPORTES_EMAIL)
            ->first();

        $huerfano = Config::where('model', 'role')
            ->where('shortname', 'support_email')
            ->value('value');

        $vacio = $vivo === null || trim((string) $vivo->value) === '';

        if ($vacio && is_string($huerfano) && trim($huerfano) !== '') {
            Config::updateOrCreate(
                ['model' => Settings::AMBITO, 'shortname' => Settings::SOPORTES_EMAIL],
                [
                    'value' => trim($huerfano),
                    'name' => $vivo->name ?? 'Correo de avisos de soporte',
                    'type' => $vivo->type ?? 'email',
                ]
            );

            // Se deja dicho en el log del panel, porque cambia a quién le llegan los
            // avisos y eso tiene que ser visible. El correo no es un secreto.
            \App\Models\Monitoring\Log::db(
                'info',
                '16014',
                'Destinatario de los avisos de soporte recuperado de un ajuste antiguo: '
                . trim($huerfano) . '. Antes estaba vacío, así que los avisos de soporte '
                . 'iban a los destinatarios de licencias.',
                'Config',
                Settings::SOPORTES_EMAIL
            );
        }

        // ============ 2. Borrar los cinco ============
        foreach (self::MUERTOS as [$ambito, $clave]) {
            Config::where('model', $ambito)->where('shortname', $clave)->forceDelete();
        }

        // La caché de ajustes se olvida: si no, el valor recuperado tarda en notarse.
        // Por el método del servicio y no por la clave: `CACHE_KEY` es privada, y lo es
        // bien —quién la olvida es asunto de `Settings`—.
        app(Settings::class)->olvidar();
    }

    /**
     * No se restauran.
     *
     * **A propósito.** Eran filas que nadie leía, una de ellas con una credencial, y
     * volver a crearlas sin valor no devuelve nada útil: recrearía justo la confusión que
     * esta migración quita. El único cambio con efecto —el destinatario de soporte— se
     * queda, porque deshacerlo volvería a mandar los avisos a Comercial.
     */
    public function down(): void
    {
        // Nada que deshacer.
    }
};
