<?php

namespace App\Livewire\Users;

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

/**
 * Borrar un usuario del panel.
 *
 * **Lo que había** era un borrado directo, y el «no se puede borrar a un administrador»
 * llegaba **después** de pulsar, como un mensaje de error. La modal lo dice antes.
 *
 * Y pide **escribir el correo**. Es el patrón para lo que no se hace por error: quitar el
 * acceso a una persona no debería ser un clic en una fila entre veinte iguales. No es
 * paranoia —el borrado es lógico y se puede revertir—, es que el clic equivocado en una
 * lista de nombres parecidos pasa.
 */
class UserDeleteModal extends ModalComponent
{
    public User $user;

    /** El correo escrito a mano. Tiene que coincidir para poder borrar. */
    public string $confirmacion = '';

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

        $this->user = User::with('roles')->findOrFail($userId);
    }

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

    /** ¿Está escrito el correo correcto? */
    public function puedeBorrar(): bool
    {
        return $this->user->is_deletable()
            && mb_strtolower(trim($this->confirmacion)) === mb_strtolower($this->user->email);
    }

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

        // Se vuelve a comprobar aquí: esconder el botón no es protegerlo (MGR-005).
        if (! $this->user->is_deletable()) {
            session()->flash('error', 'Este usuario no se puede borrar porque es un administrador.');
            $this->closeModal();

            return;
        }

        if (! $this->puedeBorrar()) {
            $this->addError('confirmacion', 'El correo no coincide.');

            return;
        }

        $nombre = $this->user->name;
        $correo = $this->user->email;
        $rol = $this->user->roles->first()?->name;

        $this->user->delete();

        MonitoringLog::db(
            'warning',
            '16023',
            'Usuario borrado del panel: ' . $nombre . ' (' . $correo . ')'
            . ($rol ? ', rol ' . $rol : ', sin rol')
            . ' (por ' . (Auth::user()?->name ?? 'desconocido') . ')',
            'User',
            (string) $this->user->id
        );

        session()->flash('success', 'El usuario «' . $nombre . '» (' . $correo . ') ya no tiene '
            . 'acceso al panel. Sus acciones siguen en el registro a su nombre.');

        // 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(['usersChanged']);
    }

    public function render()
    {
        return view('livewire.users.user-delete-modal');
    }
}
