'Unauthorized']); exit; } require_once __DIR__ . '/class/VisualLimsApiClient.class.php'; header('Content-Type: application/json'); ini_set('display_errors', '0'); error_reporting(E_ALL); $q = mb_strtolower(trim($_GET['q'] ?? '')); $limit = max(1, min(50, intval($_GET['limit'] ?? 20))); $id = isset($_GET['id']) ? intval($_GET['id']) : null; try { // Load from cache or API $cacheFile = __DIR__ . '/cache/clienti.json'; if (file_exists($cacheFile) && (time() - filemtime($cacheFile) < 3600)) { $data = json_decode(file_get_contents($cacheFile), true); } else { $api = VisualLimsApiClient::getInstance(); $params = [ '$select' => 'IdCliente,Nominativo,CodiceCliente', '$orderby' => 'Nominativo asc' ]; $data = $api->get("Cliente?" . http_build_query($params)); if (!is_dir(__DIR__ . '/cache')) mkdir(__DIR__ . '/cache', 0777, true); file_put_contents($cacheFile, json_encode($data)); } $clients = $data['value'] ?? []; // If requesting by specific ID (for loading selected value) if ($id !== null) { foreach ($clients as $c) { if ((int)$c['IdCliente'] === $id) { echo json_encode(['results' => [['id' => $c['IdCliente'], 'text' => trim($c['Nominativo'] ?? '')]]]); exit; } } echo json_encode(['results' => []]); exit; } // Search by query $results = []; foreach ($clients as $c) { $name = trim($c['Nominativo'] ?? ''); $code = trim($c['CodiceCliente'] ?? ''); if ($q === '' || mb_strpos(mb_strtolower($name), $q) !== false || mb_strpos(mb_strtolower($code), $q) !== false) { $results[] = ['id' => $c['IdCliente'], 'text' => $name]; if (count($results) >= $limit) break; } } echo json_encode(['results' => $results]); } catch (Exception $e) { http_response_code(500); echo json_encode(['error' => $e->getMessage()]); }