<?php
/* social.php – Активность в соцсетях | Avatiah Security Index
   Обновление: каждые 30 минут через JS (без cron)
   Кэш: social_cache.json
   API: fetch_social.php
   Дата: 01.11.2025 10:00 UTC
   Актуальные данные: 3.8K сообщений/час, AAL 4, тональность 72% негативная
*/

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

$update_interval = 30; // Каждые 30 минут

// --- 1. Чтение кэша ---
$cache_file = __DIR__ . '/social_cache.json';
$social = [
    'last_update' => '01.11.2025 10:00 UTC',
    'messages_per_hour' => 3800,
    'chart_data' => [800, 900, 1200, 1800, 2100, 2500, 2800, 3200, 3500, 3700, 3800],
    'aal' => 4,
    'aal_text' => 'Критическая активность',
    'aal_color' => '#ef4444',
    'sentiment' => ['negative' => 72, 'neutral' => 20, 'positive' => 8],
    'platforms' => [
        ['name' => 'X (Twitter)', 'messages' => 3800, 'share' => '68%', 'focus' => 'Оперативные новости, анализ'],
        ['name' => 'Telegram', 'messages' => 950, 'share' => '17%', 'focus' => 'Каналы, закрытые группы'],
        ['name' => 'Reddit', 'messages' => 450, 'share' => '8%', 'focus' => 'Обсуждения, AMA'],
        ['name' => 'Другие', 'messages' => 400, 'share' => '7%', 'focus' => 'Форумы, блоги']
    ],
    'geography' => [
        ['region' => 'Ближний Восток', 'level' => 'Очень высокая', 'sentiment' => 'negative', 'topics' => 'Безопасность, суверенитет'],
        ['region' => 'Северная Америка', 'level' => 'Высокая', 'sentiment' => 'neutral', 'topics' => 'Влияние на рынки, политика'],
        ['region' => 'Европа', 'level' => 'Высокая', 'sentiment' => 'negative', 'topics' => 'Энергетика, беженцы'],
        ['region' => 'Азия', 'level' => 'Средняя', 'sentiment' => 'neutral', 'topics' => 'Экономические последствия']
    ],
    'trends' => [
        ['topic' => '#GeopoliticalCrisis', 'volume' => '1.2K', 'sentiment' => 'negative', 'desc' => 'Обсуждение эскалации и возможных сценариев'],
        ['topic' => '#MilitaryMovements', 'volume' => '980', 'sentiment' => 'neutral', 'desc' => 'Отслеживание передвижений военных кораблей и самолетов'],
        ['topic' => '#DiplomacyWatch', 'volume' => '750', 'sentiment' => 'neutral', 'desc' => 'Обсуждение дипломатических усилий и переговоров'],
        ['topic' => '#EconomicImpact', 'volume' => '620', 'sentiment' => 'negative', 'desc' => 'Опасения относительно влияния на мировую экономику']
    ],
    'key_metrics' => [
        ['label' => 'Социальная активность', 'value' => '3.8K/час', 'status' => 'Экстремальный', 'source' => 'X (Twitter)'],
        ['label' => 'Тональность', 'value' => '72% негативная', 'status' => 'Поляризация', 'source' => 'Анализ настроений'],
        ['label' => 'География', 'value' => '85+ стран', 'status' => 'Глобализация', 'source' => 'Геолокация'],
        ['label' => 'AAL', 'value' => '4', 'status' => 'Критический', 'source' => 'Avatiah'],
        ['label' => 'Вклад в индекс', 'value' => '7.6/10', 'status' => 'Максимальный', 'source' => 'Вес: 4.4%']
    ],
    'normal_range' => '0.1–1K',
    'trend' => 'Быстрый рост (+18% за 24 ч)'
];

if (file_exists($cache_file) && (time() - filemtime($cache_file)) < 1800) {
    $json = file_get_contents($cache_file);
    $tmp = json_decode($json, true);
    if (json_last_error() === JSON_ERROR_NONE) $social = array_merge($social, $tmp);
}

// --- 2. Расчёт AAL ---
$messages = (int)$social['messages_per_hour'];
$aal = $messages >= 4000 ? 5 : ($messages >= 3100 ? 4 : ($messages >= 2100 ? 3 : ($messages >= 1100 ? 2 : 1)));
$social['aal'] = $aal;
$social['aal_text'] = ['Низкая активность','Повышенная активность','Высокая активность','Критическая активность','Экстремальная активность'][$aal-1];
$social['aal_color'] = ['#10b981','#f59e0b','#f97316','#ef4444','#dc2626'][$aal-1];

// --- 3. Синхронизация с total_index.json ---
$total_file = __DIR__ . '/total_index.json';
$total = ['factors'=>[], 'total_aal'=>1.0, 'last_update'=>date('d.m.Y H:i').' UTC', 'factor_count'=>0];
if (file_exists($total_file)) {
    $json = file_get_contents($total_file);
    $tmp = json_decode($json, true);
    if (json_last_error() === JSON_ERROR_NONE) $total = $tmp;
}
$contribution = round($aal * 1.52, 1); // 7.6 / 5 = 1.52
$total['factors']['social'] = [
    'aal' => $aal,
    'last_update' => $social['last_update'],
    'messages' => $messages,
    'contribution' => $contribution
];
$sum = $cnt = 0;
foreach ($total['factors'] as $f) if (isset($f['aal'])) { $sum += $f['aal']; $cnt++; }
$total['total_aal'] = $cnt ? round($sum/$cnt, 2) : 1.0;
$total['factor_count'] = $cnt;
$total['last_update'] = date('d.m.Y H:i').' UTC';
file_put_contents($total_file, json_encode($total, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT));

// --- 4. JS-данные ---
$js_data = json_encode([
    'chart_data' => $social['chart_data'],
    'aal_color' => $social['aal_color'],
    'last_update' => $social['last_update']
], JSON_UNESCAPED_UNICODE);
?>
<!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>
    <meta name="description" content="AAL <?= $aal ?>. <?= number_format($messages) ?> сообщений/час. <?= $social['last_update'] ?>">
    <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
    <style>
        :root{--bg:#0a0e1a;--card:#1a2332;--border:#2d3748;--text:#e2e8f0;--green:#10b981;--yellow:#f59e0b;--orange:#f97316;--red:#ef4444;--darkred:#dc2626;--font-base:1rem;--font-sm:.875rem;--font-xs:.75rem}
        *{box-sizing:border-box;margin:0;padding:0}
        html{font-size:100%;scroll-behavior:smooth}
        body{background:var(--bg);color:var(--text);font-family:'Inter',sans-serif;line-height:1.6;padding:clamp(.5rem,2vw,1rem);min-height:100vh;display:flex;flex-direction:column}
        .container{max-width:1600px;margin:0 auto;display:grid;gap:clamp(1rem,2.5vw,1.5rem)}
        @media(min-width:768px){.container{grid-template-columns:1fr 340px}}
        @media(min-width:1200px){.container{grid-template-columns:1fr 360px}}
        .section{background:var(--card);border-radius:12px;padding:clamp(1rem,2.5vw,1.5rem);border:1px solid var(--border)}
        .header{background:linear-gradient(135deg,#2980b9,#3498db);color:#fff;padding:clamp(1.5rem,4vw,2rem);border-radius:16px;text-align:center}
        .header h1{font-size:clamp(1.8rem,5vw,2.8rem);margin-bottom:.5rem}
        .header p{font-size:clamp(.9rem,2vw,1rem);opacity:.9}
        .back-link{display:inline-block;margin-top:1rem;color:#fff;text-decoration:underline;font-size:clamp(.8rem,1.8vw,.9rem)}
        .aal-circle{width:clamp(100px,20vw,140px);height:clamp(100px,20vw,140px);border-radius:50%;margin:0 auto 1rem;display:flex;align-items:center;justify-content:center;font-size:clamp(2rem,6vw,3rem);font-weight:700}
        .aal-info{text-align:center}
        .aal-info h2{font-size:clamp(1.3rem,4vw,1.8rem);margin:.5rem 0}
        .aal-stats{display:flex;flex-wrap:wrap;justify-content:center;gap:.75rem;margin:.75rem 0;font-size:clamp(.85rem,2vw,.95rem)}
        .sources{text-align:center;font-size:var(--font-xs);color:#94a3b8;margin-top:.5rem}
        .chart-container{position:relative;height:clamp(280px,45vw,340px);margin:1.5rem 0;background:rgba(255,255,255,.05);border-radius:8px;padding:1rem}
        .aal-scale{display:grid;grid-template-columns:repeat(5,1fr);gap:.5rem;margin:1rem 0}
        .scale-item{padding:clamp(.6rem,1.5vw,.9rem);border-radius:8px;text-align:center;font-size:var(--font-xs);background:rgba(255,255,255,.03)}
        .scale-item.active{border:2px solid #fff}
        .scale-item div:first-child{font-weight:700;font-size:1.1em}
        .data-table{width:100%;border-collapse:collapse;margin:1rem 0;font-size:var(--font-sm)}
        .data-table th,.data-table td{padding:.75rem;text-align:left;border-bottom:1px solid var(--border)}
        .data-table th{background:rgba(255,255,255,.05);font-weight:600}
        .status-green{color:var(--green)}
        .trend-item{padding:.75rem 0;border-bottom:1px solid var(--border);font-size:var(--font-sm)}
        .trend-item:last-child{border-bottom:none}
        .trend-topic{color:#3498db;font-weight:600}
        .trend-volume{color:#94a3b8;font-size:var(--font-xs)}
        .sentiment-positive{color:var(--green)}
        .sentiment-negative{color:var(--red)}
        .sentiment-neutral{color:var(--yellow)}
        .sidebar .section{margin-bottom:1rem}
        .sidebar h3{font-size:clamp(1rem,2.5vw,1.1rem);margin-bottom:.5rem}
        .aal-thresholds{display:flex;flex-direction:column;gap:.4rem;margin-top:.5rem}
        .threshold{display:flex;align-items:center;font-size:.85rem}
        .threshold-bar{width:100%;height:8px;background:#334155;border-radius:4px;overflow:hidden;margin-left:.5rem}
        .threshold-fill{height:100%;transition:width .3s ease}
        .threshold-1 .threshold-fill{background:var(--green);width:20%}
        .threshold-2 .threshold-fill{background:var(--yellow);width:40%}
        .threshold-3 .threshold-fill{background:var(--orange);width:60%}
        .threshold-4 .threshold-fill{background:var(--red);width:80%}
        .threshold-5 .threshold-fill{background:var(--darkred);width:100%}
        .current-aal{font-weight:700}
        .footer{margin-top:auto;background:#111827;padding:clamp(1.5rem,4vw,2rem);border-top:1px solid var(--border);text-align:center;font-size:var(--font-sm);color:#94a3b8}
        .footer a{color:inherit;text-decoration:underline}
        .update-status{font-size:.8rem;color:#10b981;text-align:center;margin-top:.5rem}
        @media(max-width:480px){.aal-stats{flex-direction:column;align-items:center}.aal-scale{grid-template-columns:1fr}}
        @media(min-width:768px) and (max-width:992px){.container{grid-template-columns:1fr}}
    </style>
</head>
<body>
<div class="container">
    <div class="main-content">
        <div class="header">
            <h1>Активность в соцсетях</h1>
            <p>Израиль • Иран • Регион | <span id="last-update"><?= $social['last_update'] ?></span></p>
            <a href="/" class="back-link">← Назад к индексу</a>
        </div>

        <div class="section">
            <div class="aal-info">
                <div class="aal-circle" id="aal-circle" style="background:<?= $social['aal_color'] ?>"><?= $social['aal'] ?>.0</div>
                <h2 id="aal-text"><?= $social['aal_text'] ?></h2>
                <div class="aal-stats">
                    <div><strong id="messages-value"><?= number_format($messages) ?></strong> сообщений/час</div>
                    <div><strong>Норма</strong> (<?= $social['normal_range'] ?>)</div>
                </div>
            </div>
            <p class="sources">Обновлено: <span id="sources-update"><?= $social['last_update'] ?></span> | X, Telegram, Reddit</p>
            <p class="update-status" id="update-status">Обновление через <span id="countdown">30:00</span></p>
        </div>

        <div class="section">
            <h2 style="font-size:clamp(1.2rem,3vw,1.4rem);margin-bottom:.75rem;">График активности (10 дней)</h2>
            <div class="chart-container"><canvas id="social-chart"></canvas></div>
        </div>

        <div class="section">
            <h2 style="font-size:clamp(1.2rem,3vw,1.4rem);margin-bottom:.75rem;">Ключевые показатели</h2>
            <table class="data-table" id="key-metrics">
                <tr><th>Показатель</th><th>Значение</th><th>Статус</th><th>Источник</th></tr>
                <?php foreach ($social['key_metrics'] as $m): ?>
                <tr>
                    <td><?= htmlspecialchars($m['label']) ?></td>
                    <td><strong><?= htmlspecialchars($m['value']) ?></strong></td>
                    <td class="status-green">● <?= htmlspecialchars($m['status']) ?></td>
                    <td><?= htmlspecialchars($m['source']) ?></td>
                </tr>
                <?php endforeach; ?>
            </table>
        </div>

        <div class="section">
            <h2 style="font-size:clamp(1.2rem,3vw,1.4rem);margin-bottom:.75rem;">Распределение по платформам</h2>
            <table class="data-table">
                <tr><th>Платформа</th><th>Активность</th><th>Доля</th><th>Фокус</th></tr>
                <?php foreach ($social['platforms'] as $p): ?>
                <tr>
                    <td><?= htmlspecialchars($p['name']) ?></td>
                    <td><?= $p['messages'] ?></td>
                    <td><?= $p['share'] ?></td>
                    <td><?= htmlspecialchars($p['focus']) ?></td>
                </tr>
                <?php endforeach; ?>
            </table>
        </div>

        <div class="section">
            <h2 style="font-size:clamp(1.2rem,3vw,1.4rem);margin-bottom:.75rem;">География активности</h2>
            <table class="data-table">
                <tr><th>Регион</th><th>Уровень</th><th>Тональность</th><th>Темы</th></tr>
                <?php foreach ($social['geography'] as $g): ?>
                <tr>
                    <td><?= htmlspecialchars($g['region']) ?></td>
                    <td><?= $g['level'] ?></td>
                    <td class="sentiment-<?= $g['sentiment'] ?>">● <?= ucfirst($g['sentiment']) ?></td>
                    <td><?= htmlspecialchars($g['topics']) ?></td>
                </tr>
                <?php endforeach; ?>
            </table>
        </div>

        <div class="section">
            <h2 style="font-size:clamp(1.2rem,3vw,1.4rem);margin-bottom:.75rem;">Топ-тренды</h2>
            <div id="trends-container">
                <?php foreach ($social['trends'] as $t): ?>
                <div class="trend-item">
                    <div class="trend-topic"><?= htmlspecialchars($t['topic']) ?> <span class="sentiment-<?= $t['sentiment'] ?>">● <?= ucfirst($t['sentiment']) ?></span></div>
                    <div><?= htmlspecialchars($t['desc']) ?></div>
                    <div class="trend-volume"><?= $t['volume'] ?> сообщений/час</div>
                </div>
                <?php endforeach; ?>
            </div>
        </div>

        <div class="section">
            <h2 style="font-size:clamp(1.2rem,3vw,1.4rem);margin-bottom:.75rem;">Шкала социального воздействия</h2>
            <div class="aal-scale">
                <div class="scale-item <?= $aal==1?'active':'' ?>" style="background:#10b98120"><div>1</div><div>Низкая<br><small>0.1–1K</small></div></div>
                <div class="scale-item <?= $aal==2?'active':'' ?>" style="background:#f59e0b20"><div>2</div><div>Повышенная<br><small>1.1–2K</small></div></div>
                <div class="scale-item <?= $aal==3?'active':'' ?>" style="background:#f9731620"><div>3</div><div>Высокая<br><small>2.1–3K</small></div></div>
                <div class="scale-item <?= $aal==4?'active':'' ?>" style="background:#ef444420"><div>4</div><div>Критическая<br><small>3.1–4K</small></div></div>
                <div class="scale-item <?= $aal==5?'active':'' ?>" style="background:#dc262620"><div>5</div><div>Экстремальная<br><small>4K+</small></div></div>
            </div>
        </div>

    </div>

    <div class="sidebar">
        <div class="section">
            <h3>Пороги тревоги (AAL)</h3>
            <div class="aal-thresholds">
                <div class="threshold threshold-1"><span>1 – 0.1–1K</span><div class="threshold-bar"><div class="threshold-fill"></div></div></div>
                <div class="threshold threshold-2"><span>2 – 1.1–2K</span><div class="threshold-bar"><div class="threshold-fill"></div></div></div>
                <div class="threshold threshold-3"><span>3 – 2.1–3K</span><div class="threshold-bar"><div class="threshold-fill"></div></div></div>
                <div class="threshold threshold-4"><span>4 – 3.1–4K</span><div class="threshold-bar"><div class="threshold-fill"></div></div></div>
                <div class="threshold threshold-5"><span>5 – 4K+</span><div class="threshold-bar"><div class="threshold-fill"></div></div></div>
            </div>
            <p style="margin-top:.5rem;font-size:.8rem;text-align:center;">Текущий: <span class="current-aal"><?= $aal ?>.0</span></p>
        </div>

        <div class="section">
            <h3>Статистика</h3>
            <p><strong>Активность:</strong> <span id="stats-messages"><?= number_format($messages) ?>/час</span></p>
            <p><strong>Диапазон:</strong> 3.1–4K (AAL <?= $aal ?>)</p>
            <p><strong>Вклад в индекс:</strong> <?= $contribution ?>/10</p>
            <p><strong>Тренд:</strong> <?= $social['trend'] ?></p>
        </div>

        <div class="section">
            <h3>Мониторинг</h3>
            <p><strong>Платформы:</strong> X, Telegram, Reddit</p>
            <p><strong>Частота:</strong> каждые 30 мин</p>
        </div>

        <div class="section">
            <h3>Связанные факторы</h3>
            <p><a href="media.php" style="color:#60a5fa;">Медиа-упоминания</a></p>
            <p><a href="gov.php" style="color:#60a5fa;">Активность правительства</a></p>
            <p><a href="mfa.php" style="color:#60a5fa;">Активность МИД</a></p>
        </div>

        <div class="section">
            <h3>Обновление</h3>
            <p><strong>Последнее:</strong> <span id="sidebar-update"><?= date('H:i') ?></span></p>
            <p><strong>Следующее:</strong> <span id="next-update">--:--</span></p>
        </div>
    </div>
</div>

<div class="footer">
    <p><strong>Avatiah Security Index</strong> — OSINT-аналитика в реальном времени</p>
    <p>© 2025 Avatiah • <?= date('d.m.Y H:i') ?></p>
</div>

<script>
const js = <?= $js_data ?>;
let chart;

/* ---------- Инициализация графика ---------- */
function initChart() {
    const ctx = document.getElementById('social-chart').getContext('2d');
    chart = new Chart(ctx, {
        type: 'line',
        data: {
            labels: ['17.10','18.10','19.10','20.10','21.10','22.10','23.10','24.10','25.10','26.10','27.10'],
            datasets: [{
                label: 'Сообщения (тыс./час)',
                data: js.chart_data,
                borderColor: '#3498db',
                backgroundColor: 'rgba(52,152,219,0.1)',
                fill: true,
                tension: 0.4,
                pointRadius: 3
            }]
        },
        options: {
            responsive: true,
            maintainAspectRatio: false,
            plugins: { legend: { display: false } },
            scales: { y: { beginAtZero: true, max: 4000, ticks: { stepSize: 1000 } } }
        }
    });
}

/* ---------- Обновление без перезагрузки ---------- */
async function updateData() {
    try {
        await fetch('fetch_social.php?' + Date.now());
        const r = await fetch('social_cache.json?' + Date.now());
        const data = await r.json();

        document.getElementById('last-update').textContent = data.last_update;
        document.getElementById('aal-circle').textContent = data.aal + '.0';
        document.getElementById('aal-circle').style.background = data.aal_color;
        document.getElementById('aal-text').textContent = data.aal_text;
        document.getElementById('messages-value').textContent = Number(data.messages_per_hour).toLocaleString();
        document.getElementById('stats-messages').textContent = Number(data.messages_per_hour).toLocaleString();
        document.getElementById('sidebar-update').textContent = new Date().toTimeString().slice(0,5);

        chart.data.datasets[0].data = data.chart_data;
        chart.update('quiet');

        const trends = document.getElementById('trends-container');
        trends.innerHTML = '';
        data.trends.forEach(t => {
            const div = document.createElement('div');
            div.className = 'trend-item';
            div.innerHTML = `
                <div class="trend-topic">${t.topic} <span class="sentiment-${t.sentiment}">● ${t.sentiment === 'negative' ? 'Негативный' : t.sentiment === 'neutral' ? 'Нейтральный' : 'Позитивный'}</span></div>
                <div>${t.desc}</div>
                <div class="trend-volume">${t.volume} сообщений/час</div>
            `;
            trends.appendChild(div);
        });

        document.getElementById('update-status').textContent = 'Обновлено!';
        setTimeout(() => document.getElementById('update-status').textContent = 'Обновление через 30:00', 3000);
    } catch (e) { console.error(e); }
}

/* ---------- Универсальный таймер обновления ---------- */
const UPDATE_INTERVAL_MINUTES = <?= $update_interval ?>;
let countdownInterval;
function startCountdown() {
    const now = Date.now();
    const next = Math.ceil(now / (UPDATE_INTERVAL_MINUTES * 60 * 1000)) * (UPDATE_INTERVAL_MINUTES * 60 * 1000);
    let remaining = next - now;

    countdownInterval = setInterval(() => {
        remaining -= 1000;
        const min = String(Math.floor(remaining / 60000)).padStart(2, '0');
        const sec = String(Math.floor((remaining % 60000) / 1000)).padStart(2, '0');
        document.getElementById('countdown').textContent = `${min}:${sec}`;
        document.getElementById('next-update').textContent = new Date(next).toTimeString().slice(0, 5);

        if (remaining <= 0) {
            clearInterval(countdownInterval);
            updateData().then(startCountdown);
        }
    }, 1000);
}

/* Запуск */
initChart();
startCountdown();
setTimeout(updateData, 30000);
</script>
</body>
</html>