<?php
// fetch_flights.php — Автоматическое обновление VIP-рейсов через OpenSky Network API
// Учётные данные: boriscommerce@gmail.com-api-client (4000 кредитов)
// Запуск: каждые 2 минуты через cron

// === УЧЁТНЫЕ ДАННЫЕ (СКРЫТЬ В ПРОДАКШЕНЕ!) ===
$username = 'boriscommerce@gmail.com-api-client';  // Ваш Client ID
$password = ''; // Пароль не требуется — OpenSky использует только Client ID как логин

// === СПИСОК VIP-БОРТОВ (ICAO24 в нижнем регистре) ===
$vip_icao = [
    // США — SAM (Special Air Mission)
    'adfeb7' => ['country' => 'США → Израиль', 'type' => 'SAM', 'aircraft' => 'Boeing C-32A (98-0002)', 'operator' => '89th Airlift Wing', 'weight' => 2.5, 'callsign' => 'SAM281'],
    'adfeb6' => ['country' => 'США', 'type' => 'SAM', 'aircraft' => 'Boeing C-32A (98-0001)', 'operator' => '89th Airlift Wing', 'weight' => 2.5, 'callsign' => 'SAM280'],

    // Израиль — IAF VIP / CAEW
    '738a4c' => ['country' => 'Израиль', 'type' => 'IAF VIP', 'aircraft' => 'Gulfstream G550 (537)', 'operator' => '122 Nachshon Sqn', 'weight' => 1.0, 'callsign' => 'IAF001'],
    '738a4d' => ['country' => 'Израиль', 'type' => 'IAF VIP', 'aircraft' => 'Gulfstream G550 (569)', 'operator' => '122 Sqn', 'weight' => 1.0, 'callsign' => 'IAF002'],

    // Великобритания — RAF VIP
    '43c146' => ['country' => 'Великобритания → Израиль', 'type' => 'RAF', 'aircraft' => 'BAe 146 (ZE700)', 'operator' => 'No. 32 Squadron', 'weight' => 1.8, 'callsign' => 'RFR7001'],
    '43c147' => ['country' => 'Великобритания → Израиль', 'type' => 'RAF', 'aircraft' => 'BAe 146 (ZE701)', 'operator' => 'No. 32 Squadron', 'weight' => 1.8, 'callsign' => 'RFR7002'],

    // Иордания — RJAF VIP
    '745001' => ['country' => 'Иордания → Израиль', 'type' => 'RJAF', 'aircraft' => 'Gulfstream G450 (JY-JAF)', 'operator' => 'RJAF VIP Flight', 'weight' => 1.2, 'callsign' => 'JAF101'],
];

// === URL API ===
$url = "https://$username@$password@opensky-network.org/api/states/all";

// === cURL запрос ===
$ch = curl_init();
curl_setopt_array($ch, [
    CURLOPT_URL => $url,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 15,
    CURLOPT_USERAGENT => 'AvatiahSecurityIndex/1.0 (+https://yourdomain.com)',
    CURLOPT_SSL_VERIFYPEER => true,
]);

$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curl_error = curl_error($ch);
curl_close($ch);

// === Обработка ошибок ===
if ($http_code !== 200) {
    error_log("OpenSky API Error: HTTP $http_code | Response: $response | cURL: $curl_error");
    // Попробуем fallback: загрузить старый кэш
    if (file_exists('flights_cache.json')) {
        $flight_data = json_decode(file_get_contents('flights_cache.json'), true);
        if ($flight_data) {
            echo "Fallback: использован старый кэш.";
            exit;
        }
    }
    die("API недоступен. Код: $http_code");
}

$data = json_decode($response, true);
if (!isset($data['states'])) {
    error_log("OpenSky: нет данных в ответе.");
    die("Нет данных от API.");
}

$states = $data['states'];
$flights = [];
$active_count = 0;
$weighted_active = 0.0;
$now = gmdate('d.m.Y H:i') . ' UTC';

// === Фильтрация по ICAO24 ===
foreach ($states as $state) {
    $icao24 = strtolower(trim($state[0]));
    if (!isset($vip_icao[$icao24])) continue;

    $info = $vip_icao[$icao24];
    $callsign = trim($state[1]) ?: $info['callsign'];
    $on_ground = (bool)($state[8] ?? true);
    $velocity = (float)($state[9] ?? 0);
    $status = $on_ground ? 'на земле' : 'в полёте';

    // Местоположение
    $lat = $state[6] ?? null;
    $lon = $state[5] ?? null;
    $location = $on_ground
        ? 'Аэродром (на земле)'
        : sprintf('над %s°N, %s°E', round($lat, 2), round($lon, 2));

    // Активность
    if (!$on_ground && $velocity > 50) { // >50 узлов = точно в полёте
        $active_count++;
        $weighted_active += $info['weight'];
    }

    // Цель и динамика (OSINT-анализ)
    $purpose = 'Дипломатическая миссия. Мониторинг.';
    $dynamics = 'Автоматическое обнаружение.';

    // Дополнительно: определим направление
    if (!$on_ground && $lon > 30 && $lon < 40 && $lat > 25 && $lat < 35) {
        $location = 'над Израилем / Ливаном';
        $purpose = 'Вероятно, подход к Тель-Авиву.';
    }

    $flights[] = [
        'callsign' => $callsign,
        'country' => $info['country'],
        'type' => $info['type'],
        'aircraft_type' => $info['aircraft'],
        'operator' => $info['operator'],
        'status' => $status,
        'location' => $location,
        'purpose' => $purpose,
        'dynamics' => $dynamics,
        'weight' => $info['weight'],
        'source_url' => "https://globe.adsbexchange.com/?icao=$icao24"
    ];
}

// === Формирование итогового массива ===
$flight_data = [
    'total' => count($flights),
    'active_flights' => $active_count,
    'weighted_active' => round($weighted_active, 1),
    'last_update' => $now,
    'source' => 'OpenSky Network API (boriscommerce@gmail.com-api-client) + ADS-B',
    'flights' => $flights
];

// === Сохранение в кэш ===
$cache_file = __DIR__ . '/flights_cache.json';
file_put_contents($cache_file, json_encode($flight_data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));

echo "Успешно обновлено: {$flight_data['total']} бортов, {$active_count} в полёте. AAL: " . calculate_aal($weighted_active);
exit;

// === Вспомогательная функция AAL ===
function calculate_aal($weighted) {
    return $weighted >= 7 ? 5 :
           ($weighted >= 5 ? 4 :
           ($weighted >= 3.5 ? 3 :
           ($weighted >= 2 ? 2 : 1)));
}
?>