<?php

namespace App\Controllers\Admin;

use App\Controllers\BaseController;
use App\Models\UsuarioModel;
use App\Models\RolModel;
use App\Entities\Usuario;

class Usuarios extends BaseController
{
    public function index()
    {
        $model = new UsuarioModel();
        $q = $this->request->getGet('q');

        $builder = $model->select('usuario.*, rol.nombre as rol_nombre')
                         ->join('rol', 'rol.id_rol = usuario.id_rol');

        if (!empty($q)) {
            $builder->groupStart()
                    ->like('usuario.nombres', $q)
                    ->orLike('usuario.apellidos', $q)
                    ->orLike('usuario.email', $q)
                    ->groupEnd();
        }

        $usuarios = $builder->paginate(10, 'default');

        return view('admin/usuarios/index', [
            'usuarios' => $usuarios,
            'pager'    => $model->pager,
            'q'        => $q
        ]);
    }

    public function crear()
    {
        $rolModel = new RolModel();
        return view('admin/usuarios/crear', [
            'roles' => $rolModel->findAll()
        ]);
    }

    public function guardar()
    {
        $model = new UsuarioModel();

        // Validaciones manuales para contraseña obligatoria en la creación
        $rules = $model->validationRules;
        $rules['password'] = 'required|min_length[6]';

        if (!$this->validate($rules, $model->validationMessages)) {
            return redirect()->back()->withInput()->with('errors', $this->validator->getErrors());
        }

        $usuario = new Usuario();
        $usuario->id_rol = $this->request->getPost('id_rol');
        $usuario->nombres = $this->request->getPost('nombres');
        $usuario->apellidos = $this->request->getPost('apellidos');
        $usuario->email = $this->request->getPost('email');
        $usuario->password = password_hash($this->request->getPost('password'), PASSWORD_BCRYPT);
        $usuario->telefono = $this->request->getPost('telefono');
        $usuario->estado = $this->request->getPost('estado') !== null ? 1 : 0;

        if ($model->save($usuario)) {
            return redirect()->to(base_url('admin/usuarios'))->with('success', 'Usuario registrado correctamente.');
        }

        return redirect()->back()->withInput()->with('error', 'No se pudo guardar el usuario.');
    }

    public function editar($id)
    {
        $model = new UsuarioModel();
        $rolModel = new RolModel();

        $usuario = $model->find($id);
        if (!$usuario) {
            return redirect()->to(base_url('admin/usuarios'))->with('error', 'Usuario no encontrado.');
        }

        return view('admin/usuarios/editar', [
            'usuario' => $usuario,
            'roles'   => $rolModel->findAll()
        ]);
    }

    public function actualizar($id)
    {
        $model = new UsuarioModel();
        $usuario = $model->find($id);

        if (!$usuario) {
            return redirect()->to(base_url('admin/usuarios'))->with('error', 'Usuario no encontrado.');
        }

        // Para actualización, password es opcional.
        $rules = $model->validationRules;
        // Reemplazar la regla de unicidad del email para exceptuar al id actual
        $rules['email'] = "required|valid_email|is_unique[usuario.email,id_usuario,{$id}]";
        $rules['password'] = 'permit_empty|min_length[6]';

        if (!$this->validate($rules, $model->validationMessages)) {
            return redirect()->back()->withInput()->with('errors', $this->validator->getErrors());
        }

        $usuario->id_rol = $this->request->getPost('id_rol');
        $usuario->nombres = $this->request->getPost('nombres');
        $usuario->apellidos = $this->request->getPost('apellidos');
        $usuario->email = $this->request->getPost('email');
        
        $newPassword = $this->request->getPost('password');
        if (!empty($newPassword)) {
            $usuario->password = password_hash($newPassword, PASSWORD_BCRYPT);
        }

        $usuario->telefono = $this->request->getPost('telefono');
        $usuario->estado = $this->request->getPost('estado') !== null ? 1 : 0;

        if ($model->save($usuario)) {
            return redirect()->to(base_url('admin/usuarios'))->with('success', 'Usuario actualizado correctamente.');
        }

        return redirect()->back()->withInput()->with('error', 'No se pudo actualizar el usuario.');
    }

    public function eliminar($id)
    {
        $model = new UsuarioModel();
        $usuario = $model->find($id);

        if (!$usuario) {
            return redirect()->to(base_url('admin/usuarios'))->with('error', 'Usuario no encontrado.');
        }

        try {
            $model->delete($id);
            return redirect()->to(base_url('admin/usuarios'))->with('success', 'Usuario eliminado de la base de datos.');
        } catch (\Exception $e) {
            // Soft delete en caso de FK activa
            $usuario->estado = 0;
            $model->save($usuario);
            return redirect()->to(base_url('admin/usuarios'))->with('success', 'El usuario está asociado a otras tablas. Se ha desactivado en su lugar.');
        }
    }

    public function autocomplete()
    {
        $q = $this->request->getGet('q');
        
        if (empty($q) || strlen($q) < 1) {
            return $this->response->setJSON([]);
        }

        $model = new UsuarioModel();
        $usuarios = $model->select('id_usuario, nombres, apellidos, email')
                          ->groupStart()
                          ->like('nombres', $q)
                          ->orLike('apellidos', $q)
                          ->orLike('email', $q)
                          ->groupEnd()
                          ->limit(8)
                          ->findAll();

        $results = [];
        foreach ($usuarios as $usuario) {
            $results[] = [
                'id' => $usuario->id_usuario,
                'text' => $usuario->getNombreCompleto() . ' (' . $usuario->email . ')',
                'value' => $usuario->getNombreCompleto()
            ];
        }

        return $this->response->setJSON($results);
    }
}
