<?php
// collector.php — запускается по cron раз в час
require_once __DIR__ . '/config.php';
$config = require __DIR__ . '/config.php';

try {
    $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]
    );

    // === 1. Получаем данные из открытых источников ===

    // 🛢️ Нефть Brent — FRED (St. Louis Fed)
    $oil_raw = getFREDValue('DCOILBRENTEU') ?: 50; // fallback

    // 💎 Золото — FRED
    $gold_raw = getFREDValue('GOLDAMGBD228NLBM') ?: 30;

    // ⚡ Энергия — EIA (требуется бесплатный ключ)
    // Если у вас нет ключа EIA — временно отключите или используйте fallback
    // $energy_raw = getEIAValue('NG.RNGC1.D') ?: 50;

    // 📰 Медиа — GDELT (бесплатно, без ключа)
    $media_raw = getGDELTCount('Israel') ?: 500;

    // 🏛️ Активность правительства — парсинг WhiteHouse.gov
    $gov_raw = countWhiteHouseBriefings() ?: 1;

    // 🔒 Кибератаки — CISA (парсинг RSS)
    $cyber_raw = getCISAAlerCount() ?: 1;

    // 🍕 Индекс пиццы — замена: активность в Белом доме/Пентагоне
    // Используем сумму gov_raw + медиа + военные события как proxy
    $pizza_raw = max(1.0, min(5.2, 1.0 + ($gov_raw + ($media_raw / 1000) + 2) * 0.3));

    // 🚢 ВМС США — парсинг USNI News Fleet Tracker (ограниченно)
    $navy_raw = 1 + (time() % 5); // временный заглушка — позже можно улучшить

    // ✈️ Дипломатические рейсы — fallback (без API)
    $vip_raw = 5 + (time() % 15);

    // 📱 Соцсети — без API, используем медиа + gov как proxy
    $social_raw = min(5, max(1, 1 + ($media_raw / 2000)));

    // === 2. Нормализация в score (0–10) ===
    $pizza_score  = max(0, min(10, ($pizza_raw - 1) / 4.2 * 10));
    $oil_score    = max(0, min(10, ($oil_raw - 50) / 450 * 10));
    $media_score  = max(0, min(10, ($media_raw - 500) / 9500 * 10));
    $navy_score   = max(0, min(10, ($navy_raw - 1) / 4 * 10));
    $vip_score    = max(0, min(10, ($vip_raw - 5) / 15 * 10));
    $gov_score    = max(0, min(10, ($gov_raw - 1) / 3 * 10));
    $gold_score   = max(0, min(10, ($gold_raw - 30) / 170 * 10));
    $cyber_score  = max(0, min(10, ($cyber_raw - 1) / 3 * 10));
    $energy_score = max(0, min(10, ($energy_raw ?? 50 - 50) / 250 * 10));
    $social_score = max(0, min(10, ($social_raw - 1) / 3 * 10));

    // === 3. Расчёт индекса ===
    $weights = [0.221, 0.177, 0.133, 0.106, 0.088, 0.071, 0.062, 0.044, 0.053, 0.044];
    $scores = [$pizza_score, $oil_score, $media_score, $navy_score, $vip_score, $gov_score, $gold_score, $cyber_score, $energy_score, $social_score];
    
    $index = 0;
    foreach ($scores as $i => $s) {
        $index += $s * $weights[$i];
    }
    $index = max(0, min(10, $index));
    $aal = $index < 2 ? 5 : ($index < 3.5 ? 4 : ($index < 5 ? 3 : ($index < 7 ? 2 : 1)));

    // === 4. Сохранение в БД ===
    $stmt = $pdo->prepare("
        INSERT INTO readings (
            pizza_raw, oil_raw, media_raw, navy_raw, vip_raw, gov_raw, gold_raw, cyber_raw, energy_raw, social_raw,
            pizza_score, oil_score, media_score, navy_score, vip_score, gov_score, gold_score, cyber_score, energy_score, social_score,
            security_index, aal_level, is_manual
        ) VALUES (
            ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
            ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
            ?, ?, 0
        )
    ");
    $stmt->execute(array_merge(
        [$pizza_raw, $oil_raw, $media_raw, $navy_raw, $vip_raw, $gov_raw, $gold_raw, $cyber_raw, $energy_raw ?? 50, $social_raw],
        $scores,
        [$index, $aal]
    ));

    echo "✅ Данные успешно собраны и сохранены. Индекс: " . round($index, 2) . "\n";

} catch (Exception $e) {
    error_log("Ошибка в collector.php: " . $e->getMessage());
    echo "❌ Ошибка: " . $e->getMessage() . "\n";
}

// === ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ===

function getFREDValue($series_id) {
    $api_key = 'aa2d6782fd84e0776bc14511020b0917'; // зарегистрируйтесь на https://fred.stlouisfed.org/docs/api/api_key.html
    if (!$api_key) return null;
    $url = "https://api.stlouisfed.org/fred/series/observations?series_id={$series_id}&api_key={$api_key}&file_type=json&sort_order=desc&limit=1";
    $data = @json_decode(@file_get_contents($url), true);
    return $data['observations'][0]['value'] ?? null;
}

function getGDELTCount($query) {
    // GDELT Doc API — бесплатный, без ключа
    $url = "https://api.gdeltproject.org/api/v2/doc/doc?query={$query}&mode=artlist&format=json&maxrecords=1";
    $data = @json_decode(@file_get_contents($url), true);
    return $data['articlesReturned'] ?? 500;
}

function countWhiteHouseBriefings() {
    // Парсинг последних пресс-релизов
    $html = @file_get_contents('https://www.whitehouse.gov/briefings-statements/');
    if (!$html) return 1;
    // Считаем количество ссылок на статьи за последние 24 часа (упрощённо)
    return substr_count($html, '<article') ?: 1;
}

function getCISAAlerCount() {
    // Парсинг RSS CISA
    $rss = @simplexml_load_file('https://www.cisa.gov/news-events/cybersecurity-advisories/rss.xml');
    if (!$rss) return 1;
    $count = 0;
    $now = new DateTime();
    foreach ($rss->channel->item as $item) {
        $pubDate = new DateTime($item->pubDate);
        if ($now->diff($pubDate)->days < 1) $count++;
    }
    return min(5, $count + 1);
}