#!/usr/bin/env php
<?php
/**
 * Guacamole Smoke Test (REST API)
 *
 * Valida que el GuacamoleClient puede autenticarse y listar usuarios reales
 * contra la instancia de Guacamole configurada en .env (GUACAMOLE_*).
 *
 * Uso:
 *   php bin/guac-smoke
 *   php bin/guac-smoke --json
 *   php bin/guac-smoke --help
 *
 * Salida: 0 = OK, 1 = fallo de conexión/credenciales, 2 = entorno incompleto.
 */

$basePath = dirname(__DIR__);
define('BASE_PATH', $basePath . '/');

require $basePath . '/core/helpers/Env.php';
Env::load($basePath . '/.env');
require $basePath . '/core/GuacamoleClient.php';

$args = array_slice($argv, 1);
$jsonOutput = in_array('--json', $args, true);

if (in_array('--help', $args, true) || in_array('-h', $args, true)) {
    echo "\nGuacamole Smoke Test\n";
    echo "Uso:\n";
    echo "  php bin/guac-smoke          Valida login + listado de usuarios\n";
    echo "  php bin/guac-smoke --json   Salida en JSON (para CI)\n\n";
    echo "Requiere en .env: GUACAMOLE_BASE_URL, GUACAMOLE_USERNAME, GUACAMOLE_PASSWORD\n\n";
    exit(0);
}

function guac_smoke_out($code, array $payload, $jsonOutput)
{
    if ($jsonOutput) {
        echo json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) . PHP_EOL;
    } else {
        $mark = ($code === 0) ? '[ok]' : '[error]';
        echo $mark . ' ' . (isset($payload['message']) ? $payload['message'] : '') . PHP_EOL;
        if ($code === 0 && isset($payload['sample']) && is_array($payload['sample']) && count($payload['sample']) > 0) {
            echo '      usuarios (muestra): ' . implode(', ', $payload['sample']) . PHP_EOL;
        }
    }
    exit($code);
}

if (!function_exists('curl_init') && !filter_var(ini_get('allow_url_fopen'), FILTER_VALIDATE_BOOLEAN)) {
    guac_smoke_out(2, array('ok' => false, 'message' => 'Se requiere la extensión cURL o allow_url_fopen=1 para realizar peticiones HTTP.'), $jsonOutput);
}

$client = GuacamoleClient::fromEnv();

if (!$client->isConfigured()) {
    guac_smoke_out(2, array(
        'ok' => false,
        'message' => 'Entorno incompleto: define GUACAMOLE_BASE_URL, GUACAMOLE_USERNAME y GUACAMOLE_PASSWORD en .env',
    ), $jsonOutput);
}

// 1) Login
if (!$client->login()) {
    guac_smoke_out(1, array('ok' => false, 'message' => 'Login falló: ' . $client->getLastError()), $jsonOutput);
}

// 2) Listar usuarios (endpoint crítico — su fallo aborta)
$res = $client->get('users');
if (!$res['ok']) {
    guac_smoke_out(1, array(
        'ok' => false,
        'message' => 'GET users falló (HTTP ' . $res['status'] . '): ' . $res['message'],
        'dataSource' => $client->getDataSource(),
    ), $jsonOutput);
}

$users = is_array($res['data']) ? $res['data'] : array();
$usernames = array_slice(array_keys($users), 0, 5);

// 3) Sondear el resto de endpoints de solo lectura que usa la consola.
$endpoints = array(
    'users'                       => 'users',
    'userGroups'                  => 'userGroups',
    'connections'                 => 'connections',
    'connectionGroups'            => 'connectionGroups',
    'sharingProfiles'             => 'sharingProfiles',
    'schema/protocols'            => 'schema/protocols',
    'activeConnections'           => 'activeConnections',
    'history/connections'         => 'history/connections',
    'history/users'               => 'history/users',
);

$counts = array();
$failed = array();
foreach ($endpoints as $label => $path) {
    $probe = $client->get($path);
    if ($probe['ok']) {
        $counts[$label] = is_array($probe['data']) ? count($probe['data']) : 0;
    } else {
        $failed[$label] = 'HTTP ' . $probe['status'] . ': ' . $probe['message'];
    }
}

if (!empty($failed)) {
    $parts = array();
    foreach ($failed as $label => $msg) {
        $parts[] = $label . ' (' . $msg . ')';
    }
    guac_smoke_out(1, array(
        'ok' => false,
        'message' => 'Endpoints con fallo: ' . implode(', ', $parts),
        'dataSource' => $client->getDataSource(),
        'counts' => $counts,
    ), $jsonOutput);
}

$summaryParts = array();
foreach ($counts as $label => $n) {
    $summaryParts[] = $label . '=' . $n;
}

guac_smoke_out(0, array(
    'ok' => true,
    'message' => 'Conexión OK. dataSource=' . $client->getDataSource() . '. ' . implode(', ', $summaryParts),
    'dataSource' => $client->getDataSource(),
    'userCount' => count($users),
    'counts' => $counts,
    'sample' => $usernames,
), $jsonOutput);
