<?php

require_once __DIR__ . '/../config/Database.php';

class UsuarioModel {
    private $conn;

    public function __construct() {
        $this->conn = Database::getInstance();
    }

    /**
     * Registrar un nuevo usuario
     * @param string $usuario Nombre de usuario
     * @param string $contrasena Contraseña del usuario
     * @return array
     */
    public function crearUsuario($usuario, $contrasena){
        // Hashear contraseña
        $contrasena_hash = password_hash($contrasena, PASSWORD_DEFAULT);

        $stmt = $this->conn->prepare("INSERT INTO usuario (usuario, contrasena) VALUES (?, ?)");
        $stmt->bind_param("ss", $usuario, $contrasena_hash);
        if (!$stmt->execute()) {
            return [
                'estado' => 'error',
                'mensaje' => 'Error al registrar usuario: ' . $stmt->error
            ];
        }
    
        $stmt->close();
        return [
            'estado' => 'exitoso',
            'mensaje' => 'Usuario ' . $usuario . ' registrado exitosamente.'
        ];
    }

    public function actualizarUsuario($id, $usuario, $contrasena){
        // Hashear contraseña
        $contrasena_hash = password_hash($contrasena, PASSWORD_DEFAULT);

        $stmt = $this->conn->prepare("UPDATE usuario SET usuario = ?, contrasena = ? WHERE id = ?");
        $stmt->bind_param("ssi", $usuario, $contrasena_hash, $id);
        if (!$stmt->execute()) {
            return [
                'estado' => 'error',
                'mensaje' => 'Error al actualizar usuario: ' . $stmt->error
            ];
        }

        $stmt->close();
        return [
            'estado' => 'exitoso',
            'mensaje' => 'Usuario ' . $usuario .' actualizado exitosamente.'
        ];
    }

    /**
     * Iniciar sesión de un usuario
     * @param string $usuario Nombre de usuario
     * @param string $contrasena Contraseña del usuario
     * @return array
     */
    public function iniciarSesion($usuario, $contrasena) {
        $stmt = $this->conn->prepare("SELECT contrasena FROM usuario WHERE usuario = ?");
        $stmt->bind_param("s", $usuario);
        if (!$stmt->execute()) {
            return [
                'estado' => 'error',
                'mensaje' => 'Error al iniciar sesión, intentelo más tarde.',
                'res' => $stmt->error
            ];
        }

        $stmt->store_result();
        if ($stmt->num_rows == 0) {
            return [
                'estado' => 'error',
                'mensaje' => 'Usuario o contraseña incorrectos.'
            ];
        }

        $stmt->bind_result($contrasena_hash);
        $stmt->fetch();

        if (password_verify($contrasena, $contrasena_hash)){
            return [
                'estado' => 'exitoso',
                'mensaje' => 'Inicio de sesión exitoso.'
            ];
        } else {
            return [
                'estado' => 'error',
                'mensaje' => 'Usuario o contraseña incorrectos.'
            ];
        }
    }

    public function obtenerUsuarios() {
        // Preparar la consulta mysql usando msqli
        $stmt = $this->conn->prepare("SELECT id, usuario FROM usuario");
        if (!$stmt->execute()) {
            return [
                'estado' => 'error',
                'mensaje' => 'Error al obtener usuarios: ' . $stmt->error
            ];
        }
    
        // Obtener el resultado
        $result = $stmt->get_result();

        // Si no hay resultados, retornar un array con estado y mensaje
        if ($result->num_rows == 0) {
            return [
                'estado' => 'error',
                'mensaje' => 'No hay usuarios registrados.'
            ];
        }

        return $result->fetch_all(MYSQLI_ASSOC);
    }

    public function buscarUsuario($usuario) {
        $stmt = $this->conn->prepare("SELECT id, usuario FROM usuario WHERE usuario = ?");
        $stmt->bind_param("s", $usuario);
        if (!$stmt->execute()) {
            return [
                'estado' => 'error',
                'mensaje' => 'Error al verificar usuario: ' . $stmt->error
            ];
        }

        $stmt->store_result();
        // Si no hay resultados, retornar un array con estado y mensaje
        if ($stmt->num_rows == 0) {
            return [
                'estado' => 'exitoso',
                'mensaje' => 'No existe el usuario.'
            ];
        } else {
            $stmt->bind_result($id, $usuario);
            $stmt->fetch();
            return [
                'estado' => 'exitoso',
                'mensaje' => 'Usuario existe.',
                'id' => $id,
                'usuario' => $usuario
            ];
        }
    }

    public function eliminarUsuario($id){
        $stmt = $this->conn->prepare("DELETE FROM usuario WHERE id = ?");
        $stmt->bind_param("i", $id);

        if (!$stmt->execute()) {
            return [
                'estado' => 'error',
                'mensaje' => 'Error al eliminar usuario: ' . $stmt->error
            ];
        }
    
        $stmt->close();
        return [
            'estado' => 'exitoso',
            'mensaje' => 'Usuario eliminado exitosamente.'
        ];
    }

}

?>