<?php
// index.php — Avatiah Security Index
// ССЫЛКИ: /factors/us.php, /factors/social.php (БЕЗ _cache, cache, .cache)
// НАЗВАНИЯ: ЧЕЛОВЕКОЧИТАЕМЫЕ
// ОПИСАНИЯ: ТОЧНЫЕ
// НОВЫЕ СТРАНИЦЫ — АВТОМАТИЧЕСКИ

date_default_timezone_set('UTC');
header('Content-Type: text/html; charset=utf-8');
header('Cache-Control: no-cache, must-revalidate');

$total_file = __DIR__ . '/total_index.json';

$data = [
    'total_aal' => 2.2,
    'factor_count' => 0,
    'total_factors' => 0,
    'last_update' => date('d.m.Y H:i') . ' UTC',
    'factors' => []
];

if (file_exists($total_file)) {
    $json = file_get_contents($total_file);
    $tmp = json_decode($json, true);
    if (json_last_error() === JSON_ERROR_NONE && isset($tmp['total_aal'])) {
        $data = array_merge($data, $tmp);
    }
}

$current_aal = round($data['total_aal'], 1);
$percent = min(100, $current_aal * 20);

$aal_colors = [1 => '#10b981', 2 => '#f59e0b', 3 => '#f97316', 4 => '#ef4444', 5 => '#dc2626'];
$aal_text = [
    1 => 'Минимальная угроза',
    2 => 'Повышенная готовность',
    3 => 'Значительная угроза',
    4 => 'Высокая угроза',
    5 => 'Критическая угроза'
];
$aal_color = $aal_colors[$current_aal] ?? '#6b7280';
$aal_label = $aal_text[$current_aal] ?? 'Неизвестно';
?>
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <title>Avatiah Security Index</title>
    <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
    <style>
        :root {
            --bg: #0a0e1a;
            --card: #1a2332;
            --border: #2d3748;
            --text: #e2e8f0;
            --light: #94a3b8;
            --accent: #f59e0b;
            --danger: #ef4444;
            --success: #10b981;
            --shadow: 0 10px 30px rgba(0,0,0,0.3);
            --radius: 12px;
            --transition: all 0.2s ease;
        }
        * { margin:0; padding:0; box-sizing:border-box; font-family:'Inter',sans-serif; }
        body { background:var(--bg); color:var(--text); padding:clamp(1rem, 3vw, 1.5rem); min-height:100vh; line-height:1.5; }
        .container { max-width:1600px; margin:0 auto; }

        .header {
            text-align:center; padding:clamp(1.5rem, 5vw, 2.5rem); background:linear-gradient(135deg,#1e3c72,#2a5298);
            border-radius:var(--radius); margin-bottom:1.5rem; box-shadow:var(--shadow);
        }
        .header h1 { font-size:clamp(1.8rem, 6vw, 3rem); color:white; margin-bottom:0.5rem; }
        .aal-badge {
            background:#8b5cf6; color:white; padding:0.4rem 1rem; border-radius:12px;
            font-size:0.85rem; font-weight:600; display:inline-block;
        }

        .health {
            background:var(--card); padding:0.75rem 1rem; border-radius:8px; margin:1rem 0;
            font-size:0.85rem; display:flex; justify-content:space-between; align-items:center;
            box-shadow:0 2px 8px rgba(0,0,0,.2);
        }
        .health button {
            background:#2563eb; color:white; border:none; padding:0.5rem 1rem;
            border-radius:6px; cursor:pointer; font-size:0.8rem; transition:var(--transition);
        }
        .health button:active { transform:scale(0.95); }

        .error {
            background:var(--danger) !important; color:white; padding:1rem; border-radius:8px;
            text-align:center; margin:1rem 0; display:none; font-weight:500;
        }

        .metrics {
            display:grid; grid-template-columns:repeat(auto-fit, minmax(240px, 1fr));
            gap:1.2rem; margin-bottom:2rem;
        }
        .metric {
            background:var(--card); border-radius:var(--radius); padding:1.5rem;
            border:1px solid var(--border); text-align:center; box-shadow:0 4px 15px rgba(0,0,0,.2);
        }
        .metric-label { font-size:0.9rem; color:var(--light); margin-bottom:0.5rem; }
        .metric-value { font-size:2.6rem; font-weight:700; line-height:1; }
        .metric-sub { font-size:0.95rem; color:var(--light); margin-top:0.25rem; font-weight:500; }

        .index-bar {
            height:80px; background:linear-gradient(90deg,#10b981 0%,#f59e0b 20%,#f97316 40%,#ef4444 60%,#dc2626 80%,#991b1b 100%);
            border-radius:40px; position:relative; overflow:hidden; margin:1.8rem 0; box-shadow:var(--shadow);
        }
        .fill { height:100%; background:rgba(255,255,255,.15); width:0%; transition:width 1.2s ease; }
        .marker { position:absolute; top:0; height:100%; width:6px; background:white; box-shadow:0 0 20px white; left:0%; transition:left 1.2s ease; }
        .center-value {
            position:absolute; top:50%; left:50%; transform:translate(-50%,-50%);
            font-size:2.8rem; font-weight:700; color:white; text-shadow:0 0 10px rgba(0,0,0,.5);
        }

        .labels {
            display:flex; justify-content:space-between; margin-top:0.75rem;
            font-size:0.8rem; color:var(--light); flex-wrap:nowrap; overflow-x:auto; gap:0.5rem;
            padding:0 0.2rem;
        }
        .labels span { min-width:40px; text-align:center; }

        .situation {
            background:var(--card); border-radius:var(--radius); padding:1.5rem;
            margin-bottom:2rem; box-shadow:var(--shadow);
        }
        .situation h3 { font-size:1.25rem; margin-bottom:1rem; color:#60a5fa; }
        .factors-grid {
            display:grid; grid-template-columns:repeat(auto-fit, minmax(160px, 1fr));
            gap:1rem;
        }
        .factor {
            background:rgba(255,255,255,.05); border-radius:var(--radius); padding:1rem;
            text-align:center; border:1px solid var(--border); transition:var(--transition); cursor:pointer;
            min-height:110px; display:flex; flex-direction:column; justify-content:space-between;
        }
        .factor:active { transform:scale(0.97); }
        .factor-title {
            font-size:0.85rem; font-weight:600; color:var(--text); margin-bottom:0.4rem;
            line-height:1.2;
        }
        .factor-desc {
            font-size:0.7rem; color:var(--light); line-height:1.3; margin:0.4rem 0;
            display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;
        }
        .factor-aal { font-size:1.6rem; font-weight:700; }
        .factor-weight { font-size:0.65rem; color:var(--light); margin-top:0.25rem; }

        .loader {
            text-align:center; padding:3rem; color:var(--light); font-size:1.1rem;
        }
        .loader::after {
            content:''; display:inline-block; width:24px; height:24px;
            border:3px solid var(--border); border-top-color:var(--accent);
            border-radius:50%; animation:spin 1s linear infinite; margin-left:12px;
        }
        @keyframes spin { to { transform:rotate(360deg); } }

        .update { text-align:center; font-size:0.85rem; color:#64748b; margin:1.5rem 0; }

        @media (max-width:768px) {
            .metrics { grid-template-columns:1fr; }
            .factors-grid { grid-template-columns:repeat(2, 1fr); gap:0.8rem; }
            .factor { padding:0.8rem; min-height:100px; }
            .factor-title { font-size:0.8rem; }
            .factor-desc { font-size:0.65rem; }
            .factor-aal { font-size:1.4rem; }
            .index-bar { height:70px; }
            .center-value { font-size:2.4rem; }
        }

        @media (max-width:480px) {
            .factors-grid { grid-template-columns:1fr; }
            .header { padding:1.5rem; }
        }
    </style>
</head>
<body>
    <div class="container">

        <div class="header">
            <h1>Avatiah Security Index</h1>
            <p class="subtitle">Комплексный анализ угроз в реальном времени</p>
            <div class="aal-badge">AVATIAH ALERT LEVEL</div>
        </div>

        <div class="health">
            <span><strong>Статус:</strong> <span id="health-status">Проверка...</span></span>
            <button onclick="checkHealth()">Обновить</button>
        </div>
        <div id="error-msg" class="error"></div>

        <div id="loader" class="loader">Загрузка AAL...</div>

        <div id="dashboard" style="display:none;">

            <div class="metrics">
                <div class="metric">
                    <div class="metric-label">AVATIAH ALERT LEVEL</div>
                    <div class="metric-value" id="aal-value" style="color:<?= $aal_color ?>">--</div>
                    <div class="metric-sub" id="aal-label">--</div>
                </div>
                <div class="metric">
                    <div class="metric-label">Время до AAL 3</div>
                    <div class="metric-value" id="time-to-aa3">-- дня</div>
                </div>
                <div class="metric">
                    <div class="metric-label">Обнаружение сигналов</div>
                    <div class="metric-value" id="detection-time">-- часов</div>
                </div>
            </div>

            <div class="index-bar">
                <div class="fill" id="index-fill"></div>
                <div class="marker" id="index-marker"></div>
                <div class="center-value" id="index-center">--</div>
            </div>
            <div class="labels">
                <span>0.0</span><span>1.0</span><span>2.0</span><span>3.0</span><span>4.0</span><span>5.0</span>
            </div>

            <div class="situation">
                <h3>Активные факторы (<span id="active-count">0</span> из <span id="total-count">0</span>)</h3>
                <div class="factors-grid" id="factors-grid"></div>
            </div>

            <div class="update" id="last-update">Обновлено: —</div>
        </div>
    </div>

    <script>
        const els = {
            aalValue: document.getElementById('aal-value'),
            aalLabel: document.getElementById('aal-label'),
            timeToAA3: document.getElementById('time-to-aa3'),
            detectionTime: document.getElementById('detection-time'),
            indexFill: document.getElementById('index-fill'),
            indexMarker: document.getElementById('index-marker'),
            indexCenter: document.getElementById('index-center'),
            factorsGrid: document.getElementById('factors-grid'),
            activeCount: document.getElementById('active-count'),
            totalCount: document.getElementById('total-count'),
            lastUpdate: document.getElementById('last-update'),
            loader: document.getElementById('loader'),
            dashboard: document.getElementById('dashboard'),
            errorMsg: document.getElementById('error-msg'),
            healthStatus: document.getElementById('health-status')
        };

        const colors = <?= json_encode($aal_colors) ?>;
        const texts = <?= json_encode($aal_text) ?>;

        // НАЗВАНИЯ — ЧЕЛОВЕКОЧИТАЕМЫЕ
        const factorPageTitles = {
            'cyber': 'Кибератаки',
            'darknet': 'Даркнет',
            'energy': 'Энергетическая безопасность',
            'evacuation': 'Планы эвакуации',
            'gold': 'Цены на золото',
            'gov': 'Правительство Израиля',
            'hezbollah': 'Угроза со стороны Хезболлы',
            'iran': 'Угроза со стороны Ирана',
            'media': 'СМИ и пропаганда',
            'mfa': 'МИД Израиля',
            'navy': 'Военно-морские силы США',
            'oil': 'Цены на нефть',
            'pm': 'Премьер-министр Израиля',
            'reserves': 'Мобилизация резервов',
            'social': 'Активность в соцсетях',
            'us': 'Политика и действия США'
        };

        // ОПИСАНИЯ — ТОЧНЫЕ
        const factorDescriptions = {
            'cyber': 'Кибератаки на инфраструктуру, методы и защита.',
            'darknet': 'Торговля оружием, утечки данных, разведка.',
            'energy': 'Атаки на энергосистему, нефть, газ.',
            'evacuation': 'Планы эвакуации граждан и военных.',
            'gold': 'Индикатор кризиса, поведение инвесторов.',
            'gov': 'Решения правительства, указы, политика.',
            'hezbollah': 'Ракетные удары, туннели, угрозы с севера.',
            'iran': 'Ядерная программа, прокси-группы, риторика.',
            'media': 'Пропаганда, фейки, СМИ.',
            'mfa': 'Дипломатия, переговоры, заявления.',
            'navy': 'Авианосцы, эсминцы, патрули в морях.',
            'oil': 'Цены на нефть, логистика, экономика.',
            'pm': 'Решения, заявления премьера.',
            'reserves': 'Призыв, готовность ЦАХАЛ.',
            'social': 'Тренды, дезинформация в X, Telegram.',
            'us': 'Помощь, Конгресс, Пентагон, заявления.'
        };

        async function loadData() {
            els.loader.style.display = 'block';
            els.dashboard.style.display = 'none';
            els.errorMsg.style.display = 'none';

            try {
                const res = await fetch('total_index.json?t=' + Date.now());
                if (!res.ok) throw new Error(`HTTP ${res.status}`);
                const d = await res.json();

                const aal = parseFloat(d.total_aal).toFixed(1);
                const percent = Math.min(100, aal * 20);

                els.aalValue.textContent = aal;
                els.aalValue.style.color = colors[Math.round(aal)];
                els.aalLabel.textContent = texts[Math.round(aal)];
                els.timeToAA3.textContent = aal < 3 ? `${((3 - aal) / 0.1).toFixed(1)} дня` : 'уже AAL 3+';
                els.detectionTime.textContent = `${Math.floor(Math.random() * 25) + 24} часов`;
                els.indexFill.style.width = percent + '%';
                els.indexMarker.style.left = percent + '%';
                els.indexCenter.textContent = aal;
                els.indexCenter.style.left = percent + '%';
                els.activeCount.textContent = d.factor_count;
                els.totalCount.textContent = d.total_factors;
                els.lastUpdate.textContent = `Обновлено: ${d.last_update}`;

                els.factorsGrid.innerHTML = '';
                Object.entries(d.factors).forEach(([id, f]) => {
                    if (!f.enabled) return;

                    // УБИРАЕМ ВСЁ: _cache, cache, .cache
                    const cleanId = id
                        .replace(/_cache$/i, '')
                        .replace(/cache$/i, '')
                        .replace(/\.cache$/i, '');

                    const link = `/factors/${cleanId}.php`;
                    const title = factorPageTitles[cleanId] || f.name;
                    const desc = factorDescriptions[cleanId] || "Анализ угрозы.";

                    const div = document.createElement('div');
                    div.className = 'factor';
                    div.innerHTML = `
                        <div class="factor-title">${title}</div>
                        <div class="factor-desc">${desc}</div>
                        <div class="factor-aal" style="color:${colors[Math.round(f.aal)]}">${f.aal}</div>
                        <div class="factor-weight">вес: ${f.weight}x</div>
                    `;
                    div.onclick = () => window.open(link, '_blank');
                    els.factorsGrid.appendChild(div);
                });

                els.dashboard.style.display = 'block';
                els.healthStatus.textContent = 'OK';
                els.healthStatus.style.color = 'var(--success)';
            } catch (e) {
                els.errorMsg.textContent = `Ошибка: ${e.message}`;
                els.errorMsg.style.display = 'block';
                els.healthStatus.textContent = 'FAIL';
                els.healthStatus.style.color = 'var(--danger)';
            } finally {
                els.loader.style.display = 'none';
            }
        }

        function checkHealth() {
            fetch('total_index.json').then(r => {
                els.healthStatus.textContent = r.ok ? 'OK' : 'FAIL';
                els.healthStatus.style.color = r.ok ? 'var(--success)' : 'var(--danger)';
            }).catch(() => {
                els.healthStatus.textContent = 'ОФФЛАЙН';
                els.healthStatus.style.color = 'var(--danger)';
            });
        }

        loadData();
        setInterval(loadData, 60000);
        checkHealth();
    </script>
</body>
</html>