<?php

namespace App\Livewire\Environments;

use App\Models\Environments\Environment;
use App\Models\Monitoring\Log as MonitoringLog;
use App\Support\EntornoBorrable;
use Illuminate\Support\Facades\Auth;
use LivewireUI\Modal\ModalComponent;

/**
 * Borrar un entorno, **solo si está limpio**.
 *
 * Sin licencia y sin nada que cuelgue de él: ni plugins, ni datos de uso, ni contratos, ni
 * una sola petición a la API (ver `EntornoBorrable`). Es para quitar los que se crearon por
 * error, no para dar de baja un sitio: para eso está apagar, que tiene motivo y se deshace.
 *
 * Mismo patrón que el borrado de versiones (PRODSECU-198): **el botón sale siempre** y, si
 * no se puede, la modal dice por qué y qué hacer. Con la condición cumplida no hay nada que
 * perder, así que no pide escribir el nombre.
 *
 * **Borrado definitivo, no a la papelera.** `Environment` usa `SoftDeletes`, pero un entorno
 * en la papelera sigue ocupando su dominio en el índice único —el aviso «ese dominio lo
 * tiene un entorno BORRADO» de `UniqueEnvironmentDomain`—, y la suciedad que se quería
 * quitar seguiría ahí.
 *
 * **Solo Admin**, con `admin.environments.destroy`.
 */
class BorrarEntornoModal extends ModalComponent
{
    public Environment $environment;

    public function mount(int $environmentId): void
    {
        // El permiso de la ruta no se reaplica en /livewire/update. Ver MGR-005.
        $this->authorize('admin.environments.destroy');

        $this->environment = Environment::with('client')->findOrFail($environmentId);
    }

    public static function modalMaxWidth(): string
    {
        return 'lg';
    }

    /** @return list<string> */
    public function motivos(): array
    {
        return EntornoBorrable::motivos($this->environment);
    }

    public function borrar(): void
    {
        $this->authorize('admin.environments.destroy');

        // **Se vuelve a comprobar aquí, y no es redundante**: entre abrir la modal y pulsar,
        // el Moodle puede haber llamado a la API o alguien haberle asociado una licencia.
        $motivos = $this->motivos();

        if ($motivos !== []) {
            session()->flash('error', 'No se puede borrar el entorno: ' . implode(', ', $motivos) . '.');
            $this->closeModal();

            return;
        }

        $entorno = $this->environment;

        // **El rastro, antes de borrar**: después no queda fila de la que sacar nada.
        MonitoringLog::db(
            'warning',
            '16045',
            'Entorno BORRADO: ' . $entorno->name . ' (' . $entorno->domain . ', ' . $entorno->env . ')'
            . ' del cliente ' . ($entorno->client?->name ?? 'sin cliente')
            . '. Estaba limpio: sin licencia ni datos que colgaran de él'
            . ' (por ' . (Auth::user()?->name ?? 'desconocido') . ')',
            'Environment',
            (string) $entorno->id
        );

        $entorno->forceDelete();

        session()->flash('success', 'Entorno «' . $entorno->name . '» borrado.');

        // **`skipRender` es obligatorio**: después de borrar, Livewire volvería a pintar la
        // modal con un entorno que ya no existe.
        $this->skipRender();
        $this->closeModal();

        // Al listado: si se borra desde la ficha, la ficha ya no existe.
        $this->redirectRoute('environments.index', navigate: true);
    }

    public function render()
    {
        return view('livewire.environments.borrar-entorno-modal', [
            'motivos' => $this->motivos(),
        ]);
    }
}
