<?php
// collector.php — ОБНОВЛЕННАЯ ВЕРСИЯ С ОБРАБОТКОЙ ОШИБОК
require_once __DIR__ . '/lib/Logger.php';

$config = require __DIR__ . '/config.php';

try {
    Logger::info('Collector started');
    
    // ПОДКЛЮЧЕНИЕ К БАЗЕ
    $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]
    );

    // Проверяем существование таблицы
    $tableExists = $pdo->query("SHOW TABLES LIKE 'readings'")->rowCount() > 0;
    if (!$tableExists) {
        throw new Exception("Таблица 'readings' не существует. Запустите init-database.php");
    }

    echo "=== СБОР ДАННЫХ AVATIAH SECURITY INDEX ===\n";

    // === 1. Получаем данные из открытых источников ===
    
    // 🛢️ Нефть Brent — FRED
    echo "Получение данных нефти... ";
    $oil_raw = getFREDValue('DCOILBRENTEU', $config['fred_api_key']) ?: 75.5;
    echo "OK: $oil_raw\n";

    // 💎 Золото — FRED
    echo "Получение данных золота... ";
    $gold_raw = getFREDValue('GOLDAMGBD228NLBM', $config['fred_api_key']) ?: 45.5;
    echo "OK: $gold_raw\n";

    // 📰 Медиа — GDELT
    echo "Получение медиа-данных... ";
    $media_raw = getGDELTCount('Israel') ?: 1200;
    echo "OK: $media_raw\n";

    // 🏛️ Активность правительства
    echo "Получение данных правительства... ";
    $gov_raw = countWhiteHouseBriefings() ?: 2;
    echo "OK: $gov_raw\n";

    // 🔒 Кибератаки
    echo "Получение данных кибератак... ";
    $cyber_raw = getCISAAlerCount() ?: 2;
    echo "OK: $cyber_raw\n";

    // 🍕 Индекс пиццы
    $pizza_raw = max(1.0, min(5.2, 1.0 + ($gov_raw + ($media_raw / 1000) + 2) * 0.3));

    // 🚢 ВМС США
    $navy_raw = 1 + (time() % 5);

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

    // 📱 Соцсети
    $social_raw = min(5, max(1, 1 + ($media_raw / 2000)));

    // ⚡ Энергия
    $energy_raw = 60 + (rand(-10, 10));

    // === 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) / 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. Сохранение в БД ===
    echo "Сохранение в базу данных... ";
    $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, $social_raw],
        $scores,
        [$index, $aal]
    ));

    echo "OK\n";
    
    Logger::info('Data saved successfully', ['index' => $index]);
    echo "✅ ДАННЫЕ УСПЕШНО СОБРАНЫ! Индекс безопасности: " . round($index, 2) . "/10\n";
    echo "💡 AAL уровень: $aal\n";

} catch (Exception $e) {
    Logger::error('Collector failed', ['error' => $e->getMessage()]);
    echo "❌ ОШИБКА: " . $e->getMessage() . "\n";
    
    // Детальная диагностика
    if (strpos($e->getMessage(), '1045') !== false) {
        echo "🔍 Проблема: Неправильный пользователь/пароль базы данных\n";
    } elseif (strpos($e->getMessage(), '1049') !== false) {
        echo "🔍 Проблема: База данных не существует\n";
    } elseif (strpos($e->getMessage(), '42S02') !== false) {
        echo "🔍 Проблема: Таблица не существует. Запустите init-database.php\n";
    }
}

// === ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ===
// [остаются без изменений]
?>