<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;
use Spatie\Permission\Models\Role;

class UsuarioController extends Controller
{
    public function index(Request $r)
    {
        $q = User::query()->with('roles');
        if ($busqueda = trim((string)$r->get('q', ''))) {
            $q->where(fn($w) => $w->where('usuario','like',"%$busqueda%")
                ->orWhere('nombres','like',"%$busqueda%")->orWhere('apellidos','like',"%$busqueda%"));
        }
        $registros = $q->orderBy('usuario')->paginate(25)->withQueryString();
        return view('usuarios.index', compact('registros','busqueda'));
    }

    public function create()
    {
        return view('usuarios.form', ['registro' => new User(['activo' => true]), 'roles' => Role::orderBy('name')->get()]);
    }

    public function store(Request $r)
    {
        $datos = $this->validar($r);
        $rol = $datos['rol'] ?? 'Consulta';
        unset($datos['rol']);
        $u = User::create($datos);
        $u->assignRole($rol);
        return redirect()->route('usuarios.index')->with('exito','Usuario creado.');
    }

    public function edit(User $usuario)
    {
        return view('usuarios.form', ['registro' => $usuario, 'roles' => Role::orderBy('name')->get()]);
    }

    public function update(Request $r, User $usuario)
    {
        $datos = $this->validar($r, $usuario->id);
        $rol = $datos['rol'] ?? null;
        unset($datos['rol']);
        if (empty($datos['password'])) unset($datos['password']);
        if (empty($datos['clave_firma'])) unset($datos['clave_firma']);
        $usuario->update($datos);
        if ($rol) $usuario->syncRoles([$rol]);
        return redirect()->route('usuarios.index')->with('exito','Usuario actualizado.');
    }

    public function destroy(User $usuario)
    {
        if ($usuario->id === auth()->id()) return back()->with('error','No puede eliminarse a sí mismo.');
        $usuario->delete();
        return back()->with('exito','Usuario eliminado.');
    }

    private function validar(Request $r, ?int $id = null): array
    {
        return $r->validate([
            'usuario' => 'required|string|max:60|unique:usuarios,usuario' . ($id ? ",$id" : ''),
            'nombres' => 'required|string|max:120',
            'apellidos' => 'nullable|string|max:120',
            'dni' => 'nullable|string|max:20',
            'telefono' => 'nullable|string|max:30',
            'email' => 'nullable|email|max:150',
            'cargo' => 'nullable|string|max:100',
            'password' => $id ? 'nullable|string|min:6' : 'required|string|min:6',
            'clave_firma' => 'nullable|string|min:3',
            'rol' => 'nullable|string',
            'activo' => 'sometimes|boolean',
        ]) + ['activo' => $r->boolean('activo')];
    }
}
