<?php

namespace App\Livewire\Configurations\Roles;

use App\Models\Auth\User;
use Livewire\Component;
use Livewire\WithPagination;
use Spatie\Permission\Models\Role;

class Index extends Component
{
    use WithPagination;

    public string $search = '';

    protected $queryString = ['search'];

    protected $listeners = [
        'roleDeleted' => 'handleRoleDelete',
    ];

    public function updatingSearch()
    {
        $this->resetPage();
    }

    public function openDeleteModal($roleId)
    {
        $role = Role::find($roleId);

        if (!$role) {
            session()->flash('error', 'El rol no existe.');
            return;
        }

        // No permitir eliminar el rol admin
        if ($role->name === 'admin') {
            session()->flash('error', 'No se puede eliminar el rol administrador.');
            return;
        }

        // Verificar si hay usuarios con este rol
        $usersCount = User::role($role->name)->count();

        if ($usersCount > 0) {
            $message = $usersCount === 1 
                ? "No se puede eliminar este rol porque tiene 1 usuario asignado. Por favor, reasigna el usuario a otro rol antes de eliminar este."
                : "No se puede eliminar este rol porque tiene {$usersCount} usuarios asignados. Por favor, reasigna los usuarios a otros roles antes de eliminar este.";
            
            session()->flash('error', $message);
            return;
        }

        $this->dispatch('openModal',
            component: \App\Livewire\Components\ConfirmModal::class,
            arguments: [
                'itemId' => $roleId,
                'itemName' => $role->fullname ?? $role->name,
                'title' => 'Eliminar rol',
                'message' => '¿Estás seguro de que deseas eliminar este rol? Esta acción no se puede deshacer.',
                'confirmText' => 'Eliminar',
                'cancelText' => 'Cancelar',
                'eventName' => 'roleDeleted',
                'context' => 'role',
                'confirmButtonColor' => 'red',
            ]
        );
    }

    public function handleRoleDelete($data)
    {
        $roleId = $data['itemId'] ?? $data;

        try {
            $role = Role::findOrFail($roleId);

            // No permitir eliminar el rol admin
            if ($role->name === 'admin') {
                session()->flash('error', 'No se puede eliminar el rol administrador.');
                return;
            }

            // Verificar nuevamente si hay usuarios con este rol (doble verificación)
            $usersCount = User::role($role->name)->count();

            if ($usersCount > 0) {
                $message = $usersCount === 1 
                    ? "No se puede eliminar este rol porque tiene 1 usuario asignado. Por favor, reasigna el usuario a otro rol antes de eliminar este."
                    : "No se puede eliminar este rol porque tiene {$usersCount} usuarios asignados. Por favor, reasigna los usuarios a otros roles antes de eliminar este.";
                
                session()->flash('error', $message);
                return;
            }

            $role->delete();

            session()->flash('success', 'Rol eliminado correctamente.');
        } catch (\Exception $e) {
            session()->flash('error', 'Error al eliminar el rol: ' . $e->getMessage());
        }
    }

    public function render()
    {
        $roles = Role::query()
            ->when($this->search, function ($query) {
                $query->where('name', 'like', "%{$this->search}%")
                    ->orWhere('fullname', 'like', "%{$this->search}%")
                    ->orWhere('description', 'like', "%{$this->search}%");
            })
            ->orderBy('name')
            ->paginate(20);

        return view('livewire.configurations.roles.index')
            ->with('roles', $roles)
            ->layout('layouts.app');
    }
}
