<?php

namespace App\Livewire\Clients;

use App\Models\Clients\Client;
use App\Models\Monitoring\Log as MonitoringLog;
use Illuminate\Support\Facades\Auth;
use LivewireUI\Modal\ModalComponent;

/**
 * Dar de baja o volver a dar de alta un cliente, diciendo antes qué va a pasar.
 *
 * **Lo que había.** Una casilla `actived` dentro del formulario del cliente, guardada
 * como cualquier otro campo. Desmarcarla hace que el middleware devuelva «Cliente
 * inactivo» a **todas** las licencias de ese cliente: veinte Moodles dejan de recibir
 * contenido, sin confirmación, sin avisar de a cuántos afecta y **sin dejar rastro de
 * quién lo hizo**.
 *
 * Ahora es una acción con su propia pantalla, como el corte de los límites de la API:
 * lo que hace que alguien lea un aviso es que le diga **qué va a pasar y a cuántos**, no
 * un «¿estás seguro?».
 *
 * **La casilla sale del formulario.** Dos caminos al mismo estado, uno con consecuencias
 * y otro silencioso, es el problema en sí: el silencioso se acaba usando.
 */
class ClientStatusModal extends ModalComponent
{
    public Client $client;

    /** Motivo de la baja. Obligatorio: es lo que responde «¿se fue o está renegociando?». */
    public string $motivo = '';

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

        $this->client = Client::findOrFail($clientId);
    }

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

    public function darDeBaja(): void
    {
        $this->authorize('admin.clients.edit');

        $datos = $this->validate([
            // Obligatorio y con un mínimo: un «baja» de cuatro letras no le sirve a
            // nadie en seis meses, que es cuando se lee.
            'motivo' => ['required', 'string', 'min:5', 'max:500'],
        ], [
            'motivo.required' => 'Escribe el motivo de la baja: es lo que se leerá dentro de seis meses.',
            'motivo.min' => 'Un motivo de menos de 5 caracteres no explica nada.',
        ], ['motivo' => 'motivo']);

        $resultado = $this->client->darDeBaja($datos['motivo'], Auth::id());

        MonitoringLog::db(
            'warning',
            '16019',
            'Cliente dado de BAJA: ' . $this->client->name
            . ' — ' . $resultado['licencias'] . ' licencia(s) y ' . $resultado['entornos']
            . ' entorno(s) desactivados. Motivo: ' . $datos['motivo']
            . ' (por ' . (Auth::user()?->name ?? 'desconocido') . ')',
            'Client',
            (string) $this->client->id
        );

        session()->flash('warning', $this->client->name . ' está de baja: '
            . $resultado['licencias'] . ' licencia(s) y ' . $resultado['entornos']
            . ' entorno(s) desactivados. Sus Moodles ya reciben «Cliente inactivo».');

        // Clave numérica: el paquete hace `[$event, $params] = $event` cuando el valor es
        // un array, así que `['evento' => []]` revienta con "Undefined array key 0".
        $this->closeModalWithEvents(['clientStatusChanged']);
    }

    public function reactivar(): void
    {
        $this->authorize('admin.clients.edit');

        $resultado = $this->client->reactivar(Auth::id());

        MonitoringLog::db(
            'info',
            '16019',
            'Cliente reactivado: ' . $this->client->name
            . ' — ' . $resultado['licencias'] . ' licencia(s) y ' . $resultado['entornos']
            . ' entorno(s) reactivados'
            . ($resultado['caducadas'] > 0
                ? ', ' . $resultado['caducadas'] . ' licencia(s) NO se reactivaron por estar caducadas'
                : '')
            . ' (por ' . (Auth::user()?->name ?? 'desconocido') . ')',
            'Client',
            (string) $this->client->id
        );

        $mensaje = $this->client->name . ' vuelve a estar de alta: '
            . $resultado['licencias'] . ' licencia(s) y ' . $resultado['entornos'] . ' entorno(s) reactivados.';

        if ($resultado['caducadas'] > 0) {
            $mensaje .= ' ' . $resultado['caducadas'] . ' licencia(s) se han quedado desactivadas '
                . 'porque caducaron durante la baja: hay que renovarlas.';
        }

        session()->flash($resultado['caducadas'] > 0 ? 'warning' : 'success', $mensaje);

        // Clave numérica: el paquete hace `[$event, $params] = $event` cuando el valor es
        // un array, así que `['evento' => []]` revienta con "Undefined array key 0".
        $this->closeModalWithEvents(['clientStatusChanged']);
    }

    public function render()
    {
        return view('livewire.clients.client-status-modal', [
            'impacto' => $this->client->actived
                ? $this->client->impactoDeLaBaja()
                : $this->client->impactoDelAlta(),
        ]);
    }
}
