<?php
/**
 * Pulssi Standalone PHP Health Probe
 * 
 * Kevyt ja itsenäinen diagnostiikkatiedosto mille tahansa PHP-palvelimelle
 * (Custom PHP, Laravel, Magento, PrestaShop, Symfony).
 *
 * Käyttöohje:
 * 1. Kopioi tämä tiedosto palvelimesi julkiseen hakemistoon (esim. /pulssi-probe.php)
 * 2. Määritä turvallinen API-avain tiedostoon .pulssi-token samaan hakemistoon
 * 3. Pulssi-palvelin voi nyt lukea diagnostiikkatiedot X-Pulssi-Token -otsakkeella
 */

header('Content-Type: application/json; charset=utf-8');

$tokenFile = __DIR__ . '/.pulssi-token';
$configuredToken = '';

if (file_exists($tokenFile)) {
    $configuredToken = trim(file_get_contents($tokenFile));
}

// Jos avainta ei ole määritetty, luodaan automaattisesti turvallinen avain .pulssi-token tiedostoon
if (empty($configuredToken)) {
    $configuredToken = bin2hex(random_bytes(16));
    @file_put_contents($tokenFile, $configuredToken);
}

// Tarkistetaan saapuva avain
$providedToken = '';
if (isset($_SERVER['HTTP_X_PULSSI_TOKEN'])) {
    $providedToken = trim($_SERVER['HTTP_X_PULSSI_TOKEN']);
} elseif (isset($_SERVER['HTTP_AUTHORIZATION']) && preg_match('/Bearer\s+(\S+)/i', $_SERVER['HTTP_AUTHORIZATION'], $m)) {
    $providedToken = $m[1];
} elseif (isset($_GET['token'])) {
    $providedToken = trim($_GET['token']);
}

if (empty($providedToken) || !hash_equals($configuredToken, $providedToken)) {
    http_response_code(401);
    echo json_encode(array(
        'status' => 'error',
        'error'  => 'Unauthorized: Virheellinen tai puuttuva Pulssi API-avain.'
    ));
    exit;
}

$disabled_functions = array_filter(array_map('trim', explode(',', ini_get('disable_functions') ?: '')));
$dangerous_functions = array('exec', 'passthru', 'shell_exec', 'system', 'proc_open', 'popen');
$exposed_dangerous = array_values(array_diff($dangerous_functions, $disabled_functions));

$disk_free = @disk_free_space(__DIR__);
$disk_total = @disk_total_space(__DIR__);
$disk_usage_pct = ($disk_total > 0 && $disk_free !== false) ? round((($disk_total - $disk_free) / $disk_total) * 100, 1) : null;

$response = array(
    'status'       => 'ok',
    'generated_at' => gmdate('c'),
    'agent'        => array(
        'name'    => 'pulssi-standalone-probe',
        'version' => '1.0.0',
    ),
    'php'          => array(
        'version'              => PHP_VERSION,
        'sapi'                 => php_sapi_name(),
        'memory_limit'         => ini_get('memory_limit'),
        'max_execution_time'   => (int) ini_get('max_execution_time'),
        'upload_max_filesize'  => ini_get('upload_max_filesize'),
        'post_max_size'        => ini_get('post_max_size'),
        'allow_url_fopen'      => (bool) ini_get('allow_url_fopen'),
        'display_errors'       => (bool) ini_get('display_errors'),
        'opcache_enabled'      => function_exists('opcache_get_status') && !empty(opcache_get_status(false)['opcache_enabled']),
        'exposed_dangerous_fn' => $exposed_dangerous,
        'server_software'      => $_SERVER['SERVER_SOFTWARE'] ?? 'Unknown',
        'os'                   => PHP_OS,
    ),
    'filesystem'   => array(
        'dot_git_exists'       => file_exists(__DIR__ . '/.git'),
        'dot_env_exists'       => file_exists(__DIR__ . '/.env'),
        'disk_free_gb'         => ($disk_free !== false) ? round($disk_free / 1024 / 1024 / 1024, 2) : null,
        'disk_total_gb'        => ($disk_total !== false) ? round($disk_total / 1024 / 1024 / 1024, 2) : null,
        'disk_usage_percent'   => $disk_usage_pct,
        'memory_current_mb'    => round(memory_get_usage(true) / 1024 / 1024, 2),
        'memory_peak_mb'       => round(memory_get_peak_usage(true) / 1024 / 1024, 2),
    ),
);

echo json_encode($response, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
