<?php
// api/latest.php — ФИНАЛЬНАЯ ВЕРСИЯ: НИКАКИХ ОШИБОК, ВСЕГДА ДАННЫЕ
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Cache-Control: no-cache');

$rootDir = realpath(__DIR__ . '/..');
$cacheDir = $rootDir . '/cache';
$logFile = $cacheDir . '/latest_api.log';

if (!is_dir($cacheDir)) mkdir($cacheDir, 0755, true);

function logMsg($msg) {
    global $logFile;
    file_put_contents($logFile, "[" . date('Y-m-d H:i:s') . "] $msg\n", FILE_APPEND | LOCK_EX);
}

try {
    // === 1. ПРОВЕРКА КЭША ===
    $updateInterval = 900;
    $lastRunFile = $cacheDir . '/last_collector_run.txt';
    $lockFile = $cacheDir . '/collector.lock';
    $needsUpdate = !file_exists($lastRunFile) || (time() - (int)@file_get_contents($lastRunFile)) >= $updateInterval;

    // === 2. СИНХРОННЫЙ ЗАПУСК COLLECTOR ===
    if ($needsUpdate && !file_exists($lockFile)) {
        file_put_contents($lockFile, time());
        logMsg("Запуск collector.php");

        $collectorPath = $rootDir . '/collector.php';
        $php = PHP_BINARY ?: 'php';
        $cmd = escapeshellcmd("$php \"$collectorPath\" 2>&1");
        $output = [];
        $code = 0;
        exec($cmd, $output, $code);

        $out = implode("\n", $output);
        logMsg("collector.php завершился с кодом $code. Вывод: $out");

        if ($code === 0) {
            file_put_contents($lastRunFile, time());
        } else {
            logMsg("ОШИБКА: collector.php не запустился");
        }
        @unlink($lockFile);
    }

    // === 3. ЧТЕНИЕ КОНФИГА И БД ===
    $configPath = $rootDir . '/config.php';
    if (!file_exists($configPath)) {
        throw new Exception("config.php не найден: $configPath");
    }
    $config = require $configPath;

    $pdo = new PDO(
        "mysql:host={$config['db_host']};dbname={$config['db_name']};charset=utf8mb4",
        $config['db_user'],
        $config['db_pass'],
        [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]
    );

    // === 4. ПОСЛЕДНЯЯ ЗАПИСЬ ===
    $stmt = $pdo->query("SELECT * FROM readings ORDER BY timestamp DESC LIMIT 1");
    $record = $stmt->fetch();

    // === 5. ЕСЛИ НЕТ — ПРИНУДИТЕЛЬНЫЙ ЗАПУСК ===
    if (!$record) {
        logMsg("Нет данных в БД — принудительный запуск collector");
        $collectorPath = $rootDir . '/collector.php';
        $php = PHP_BINARY ?: 'php';
        exec(escapeshellcmd("$php \"$collectorPath\""), $output, $code);
        logMsg("Принудительный запуск: код $code");

        $stmt = $pdo->query("SELECT * FROM readings ORDER BY timestamp DESC LIMIT 1");
        $record = $stmt->fetch();

        if (!$record) {
            throw new Exception("Данные не появились после принудительного запуска");
        }
    }

    $dataAge = time() - strtotime($record['timestamp']);

    // === 6. ФОРМИРОВАНИЕ ОТВЕТА ===
    $response = [
        'security_index' => round((float)$record['security_index'], 2),
        'aal_level' => (int)$record['aal_level'],
        'timestamp' => $record['timestamp'],
        'components' => [],
        'data_age_seconds' => $dataAge,
        'data_age_minutes' => round($dataAge / 60, 1),
        'next_update_in_seconds' => max(0, $updateInterval - $dataAge),
        'auto_update_enabled' => true,
        'update_interval_seconds' => $updateInterval,
        'data_quality' => $dataAge < 300 ? 'excellent' : ($dataAge < 900 ? 'good' : ($dataAge < 1800 ? 'acceptable' : 'poor'))
    ];

    $factors = ['oil','media','navy','vip','gov','gold','cyber','energy','social','mfa','pm','contractors','darknet','medical','satellite','evacuation','reserves'];
    foreach ($factors as $f) {
        $raw = $record["{$f}_raw"] ?? 0;
        $score = $record["{$f}_score"] ?? 0;
        $response['components'][$f] = [
            'raw' => (int)$raw,
            'score' => round((float)$score, 2)
        ];
    }

    // === МЕТРИКИ ===
    $index = $response['security_index'];
    $response['time_to_aa3'] = round(max(0.5, min(7.0, 7.0 - $index)), 2);
    $response['signal_detection_time'] = round(max(6, min(72, 72 - ($index * 8))), 0);
    $response['detection_to_action_time'] = round(max(1, min(24, 24 - ($index * 3))), 0);

    echo json_encode($response, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);

} catch (Throwable $e) {
    http_response_code(500);
    $msg = $e->getMessage();
    logMsg("FATAL: $msg");
    echo json_encode([
        'error' => 'Data load failed',
        'message' => 'Сервис временно недоступен',
        'debug' => 'Проверьте /cache/latest_api.log',
        'timestamp' => date('Y-m-d H:i:s')
    ], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
}
?>