<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');

switch ($tipo) {
    case 'login':
        $usuario = isset($datapost['usuario']) ? htmlspecialchars(trim($datapost['usuario']), ENT_QUOTES, 'UTF-8') : '';
        $password = isset($datapost['password']) ? $datapost['password'] : '';

        if (empty($usuario) || empty($password)) {
            sendResponse(false, "Usuario y contraseña son requeridos");
        }

        try {
            // Buscar usuario
            $query = "SELECT u.*, r.nombre as rol_nombre
                     FROM usuarios u
                     LEFT JOIN roles r ON u.rol_id = r.id
                     WHERE (u.usuario = ? OR u.email = ?) AND u.activo = 1";
            $stmt = $conn->prepare($query);
            $stmt->bind_param("ss", $usuario, $usuario);
            $stmt->execute();
            $result = $stmt->get_result();
            $user = $result->fetch_assoc();

            if (!$user) {
                sendResponse(false, "Credenciales incorrectas");
            }

            // Verificar password con función nativa
            if (!password_verify($password, $user['password'])) {
                sendResponse(false, "Credenciales incorrectas");
            }

            // Obtener permisos del rol
            $permisosQuery = "SELECT p.nombre
                             FROM rol_permisos rp
                             JOIN permisos p ON rp.permiso_id = p.id
                             WHERE rp.rol_id = ? AND p.activo = 1";
            $permisosStmt = $conn->prepare($permisosQuery);
            $permisosStmt->bind_param("i", $user['rol_id']);
            $permisosStmt->execute();
            $permisosResult = $permisosStmt->get_result();

            $permisos = [];
            while ($row = $permisosResult->fetch_assoc()) {
                $permisos[] = $row['nombre'];
            }

            // Obtener almacenes asignados
            $almacenesQuery = "SELECT a.id, a.nombre, a.codigo
                              FROM usuario_almacenes ua
                              JOIN almacenes a ON ua.almacen_id = a.id
                              WHERE ua.usuario_id = ? AND a.activo = 1";
            $almacenesStmt = $conn->prepare($almacenesQuery);
            $almacenesStmt->bind_param("i", $user['id']);
            $almacenesStmt->execute();
            $almacenesResult = $almacenesStmt->get_result();

            $almacenes = [];
            while ($almacen = $almacenesResult->fetch_assoc()) {
                $almacenes[] = [
                    'id' => intval($almacen['id']),
                    'nombre' => $almacen['nombre'],
                    'codigo' => $almacen['codigo']
                ];
            }

            // Generar JWT
            $token = JWT::encode([
                'sub' => $user['id'],
                'usuario' => $user['usuario'],
                'nombre' => $user['nombre'],
                'rol' => $user['rol_nombre'],
                'iat' => time(),
                'exp' => time() + JWT_EXPIRATION
            ]);

            // Actualizar último acceso
            $updateQuery = "UPDATE usuarios SET ultimo_acceso = NOW() WHERE id = ?";
            $updateStmt = $conn->prepare($updateQuery);
            $updateStmt->bind_param("i", $user['id']);
            $updateStmt->execute();

            sendResponse(true, "Login exitoso", [
                'token' => $token,
                'user' => [
                    'id' => intval($user['id']),
                    'usuario' => $user['usuario'],
                    'nombre' => $user['nombre'],
                    'email' => $user['email'],
                    'rol' => $user['rol_nombre'],
                    'rol_id' => intval($user['rol_id'])
                ],
                'permisos' => $permisos,
                'almacenes' => $almacenes
            ]);

        } catch (Exception $e) {
            sendResponse(false, "Error al autenticar: " . $e->getMessage());
        }
        break;

    case 'logout':
        // Con JWT stateless simplemente confirmamos
        // El cliente elimina el token localmente
        sendResponse(true, "Sesión cerrada exitosamente");
        break;

    case 'me':
        $user = requireAuth();

        try {
            // Obtener almacenes
            $almacenesQuery = "SELECT a.id, a.nombre, a.codigo
                              FROM usuario_almacenes ua
                              JOIN almacenes a ON ua.almacen_id = a.id
                              WHERE ua.usuario_id = ? AND a.activo = 1";
            $almacenesStmt = $conn->prepare($almacenesQuery);
            $almacenesStmt->bind_param("i", $user['id']);
            $almacenesStmt->execute();
            $almacenesResult = $almacenesStmt->get_result();

            $almacenes = [];
            while ($almacen = $almacenesResult->fetch_assoc()) {
                $almacenes[] = [
                    'id' => intval($almacen['id']),
                    'nombre' => $almacen['nombre'],
                    'codigo' => $almacen['codigo']
                ];
            }

            sendResponse(true, "Perfil obtenido", [
                'user' => [
                    'id' => intval($user['id']),
                    'usuario' => $user['usuario'],
                    'nombre' => $user['nombre'],
                    'email' => $user['email'],
                    'rol' => $user['rol_nombre'],
                    'rol_id' => intval($user['rol_id'])
                ],
                'permisos' => $user['permisos'],
                'almacenes' => $almacenes
            ]);

        } catch (Exception $e) {
            sendResponse(false, "Error al obtener perfil: " . $e->getMessage());
        }
        break;

    case 'cambiarPassword':
        $user = requireAuth();

        $password_actual = $datapost['password_actual'] ?? '';
        $password_nuevo = $datapost['password_nuevo'] ?? '';
        $password_confirmar = $datapost['password_confirmar'] ?? '';

        if (empty($password_actual) || empty($password_nuevo) || empty($password_confirmar)) {
            sendResponse(false, "Todos los campos son requeridos");
        }

        if ($password_nuevo !== $password_confirmar) {
            sendResponse(false, "La confirmación de contraseña no coincide");
        }

        if (strlen($password_nuevo) < 6) {
            sendResponse(false, "La nueva contraseña debe tener al menos 6 caracteres");
        }

        try {
            // Obtener password actual del usuario
            $query = "SELECT password FROM usuarios WHERE id = ?";
            $stmt = $conn->prepare($query);
            $stmt->bind_param("i", $user['id']);
            $stmt->execute();
            $result = $stmt->get_result();
            $userData = $result->fetch_assoc();

            if (!password_verify($password_actual, $userData['password'])) {
                sendResponse(false, "La contraseña actual es incorrecta");
            }

            // Actualizar password
            $newHash = password_hash($password_nuevo, PASSWORD_BCRYPT);
            $updateQuery = "UPDATE usuarios SET password = ? WHERE id = ?";
            $updateStmt = $conn->prepare($updateQuery);
            $updateStmt->bind_param("si", $newHash, $user['id']);

            if ($updateStmt->execute()) {
                sendResponse(true, "Contraseña actualizada exitosamente");
            } else {
                sendResponse(false, "Error al actualizar contraseña");
            }

        } catch (Exception $e) {
            sendResponse(false, "Error al cambiar contraseña: " . $e->getMessage());
        }
        break;

    default:
        sendResponse(false, "Operación no válida para autenticación");
        break;
}
