<?php
declare(strict_types=1);

/**
 * /admin/antispam/index.php
 * Адмін: Антиспам / модерація ботів
 */

require_once __DIR__ . '/../../includes/start.php';
require_role(['admin']);

require_once __DIR__ . '/../_helpers.php';
require_once __DIR__ . '/../_sidebar.php';
require_once __DIR__ . '/../../includes/security_antispam.php';

$pdo = function_exists('db') ? db() : null;
$title = 'Антиспам';

$meta_robots = 'noindex, nofollow, noarchive, nosnippet';
$meta_desc   = '';
$canonical   = function_exists('abs_url') ? abs_url('/admin/antispam/') : '/admin/antispam/';
if (!headers_sent()) {
    header('X-Robots-Tag: noindex, nofollow, noarchive, nosnippet', true);
}

if (!function_exists('h')) {
    function h(?string $s): string { return htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8'); }
}
if (!function_exists('vm_csrf_field')) {
    function vm_csrf_field(): void {
        if (function_exists('csrf_input')) {
            ob_start();
            $ret = csrf_input();
            $buf = (string)ob_get_clean();
            if (is_string($ret) && $ret !== '') { echo $ret; return; }
            if ($buf !== '') { echo $buf; return; }
        }
        if (session_status() !== PHP_SESSION_ACTIVE) {
            @session_start();
        }
        if (!isset($_SESSION['csrf']) || !is_string($_SESSION['csrf']) || $_SESSION['csrf'] === '') {
            $_SESSION['csrf'] = bin2hex(random_bytes(16));
        }
        echo '<input type="hidden" name="csrf" value="' . h((string)$_SESSION['csrf']) . '">';
    }
}

if (function_exists('csrf_init')) {
    csrf_init();
}

$flash = null;
if (isset($_GET['ok'])) {
    $ok = trim((string)$_GET['ok']);
    $msg = match ($ok) {
        'antispam' => 'Антиспам-налаштування збережено.',
        default => 'Зміни збережено.',
    };
    $flash = ['type' => 'success', 'msg' => $msg];
}
if (isset($_GET['err'])) {
    $err = trim((string)$_GET['err']);
    $msg = match ($err) {
        'csrf' => 'Помилка CSRF.',
        'db' => 'Немає з’єднання з БД.',
        'save' => 'Не вдалося зберегти зміни.',
        default => 'Сталася помилка.',
    };
    $flash = ['type' => 'danger', 'msg' => $msg];
}

$antispamSettings = antispam_default_settings();
$appSettingsOk = false;
$antispamFlagsOk = false;
$antispamStats = ['bot' => 0, 'suspect' => 0];
$recentFlags = [];

if ($pdo instanceof PDO) {
    $appSettingsOk = antispam_app_settings_has_table($pdo);
    if ($appSettingsOk) {
        $antispamSettings = antispam_get_settings($pdo);
    }

    $antispamFlagsOk = antispam_flags_has_table($pdo);
    if ($antispamFlagsOk) {
        try {
            $rows = $pdo->query('SELECT status, COUNT(*) AS cnt FROM security_antispam_flags GROUP BY status')->fetchAll(PDO::FETCH_ASSOC) ?: [];
            foreach ($rows as $row) {
                $status = (string)($row['status'] ?? '');
                if (isset($antispamStats[$status])) {
                    $antispamStats[$status] = (int)($row['cnt'] ?? 0);
                }
            }
        } catch (Throwable $e) {
            // ignore
        }

        try {
            $recentSql = 'SELECT f.id, f.user_id, f.status, f.reason_code, f.reason_text, f.created_at,
                                 u.username, u.email
                          FROM security_antispam_flags f
                          LEFT JOIN users u ON u.id = f.user_id
                          ORDER BY f.id DESC
                          LIMIT 15';
            $recentFlags = $pdo->query($recentSql)->fetchAll(PDO::FETCH_ASSOC) ?: [];
        } catch (Throwable $e) {
            $recentFlags = [];
        }
    }
}

require __DIR__ . '/../../includes/header.php';
?>

<style>
  .dev-badge{display:inline-flex;align-items:center;gap:.4rem;padding:.15rem .55rem;border-radius:999px;font-size:.78rem;font-weight:700;border:1px solid rgba(0,0,0,.12);background:rgba(255,193,7,.15)}
  .mini-muted{font-size:.85rem;color:rgba(0,0,0,.6)}
  .mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}
  .sec-box{border:1px solid rgba(0,0,0,.08);border-radius:12px;padding:12px;background:rgba(0,0,0,.02)}
  .sec-pill{display:inline-flex;align-items:center;gap:.35rem;padding:.15rem .55rem;border-radius:999px;border:1px solid rgba(0,0,0,.12);background:#fff;font-weight:700;font-size:.78rem}
  .sec-pill-ok{border-color:rgba(25,135,84,.25);background:rgba(25,135,84,.08);color:#198754}
  .sec-pill-warn{border-color:rgba(255,193,7,.35);background:rgba(255,193,7,.12)}
  .sec-stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:.75rem}
  .sec-stat{border:1px solid rgba(0,0,0,.08);border-radius:14px;padding:.9rem;background:#fff}
  .sec-stat .num{font-size:1.35rem;font-weight:800;line-height:1}
  .sec-stat .lbl{margin-top:.25rem;font-size:.82rem;color:#64748b}
  .status-bot,.status-suspect{display:inline-flex;align-items:center;gap:.35rem;padding:.15rem .5rem;border-radius:999px;font-weight:800;font-size:.75rem}
  .status-bot{background:rgba(220,53,69,.10);border:1px solid rgba(220,53,69,.22);color:#dc3545}
  .status-suspect{background:rgba(255,193,7,.15);border:1px solid rgba(255,193,7,.25);color:#8a6d00}
  .quick-links{display:flex;gap:.5rem;flex-wrap:wrap;margin-bottom:1rem}
  .quick-links a{display:inline-flex;align-items:center;gap:.35rem;padding:.45rem .8rem;border:1px solid rgba(0,0,0,.1);border-radius:999px;background:#fff;text-decoration:none;color:inherit;font-weight:700;font-size:.88rem}
  @media (max-width: 767.98px){.sec-stats{grid-template-columns:repeat(2,minmax(0,1fr))}}
</style>

<div class="row g-3">
  <div class="col-lg-9">

    <div class="d-flex align-items-center justify-content-between mb-2">
      <div>
        <h1 class="h4 mb-0">Антиспам</h1>
        <div class="mini-muted">
          <span class="dev-badge">🤖 Окрема сторінка модерації ботів</span>
          <span class="ms-2">Тихе автоматичне позначення підозрілих акаунтів без капчі.</span>
        </div>
      </div>
      <a class="btn btn-sm btn-outline-secondary" href="/admin/">Дашборд</a>
    </div>

    <?php if ($flash): ?>
      <div class="alert alert-<?= h((string)$flash['type']) ?>"><?= h((string)$flash['msg']) ?></div>
    <?php endif; ?>

    <div class="quick-links">
      <a href="/admin/security/">🛡 Безпека</a>
      <a href="/admin/users/">👤 Користувачі</a>
    </div>

    <div class="card card-app p-3 mb-3">
      <div class="d-flex align-items-center justify-content-between mb-2">
        <div class="fw-bold">Антиспам / боротьба з ботами</div>
        <?php if ($antispamFlagsOk): ?>
          <span class="sec-pill sec-pill-ok">✅ Таблиця підключена</span>
        <?php else: ?>
          <span class="sec-pill sec-pill-warn">⚠️ Потрібна таблиця security_antispam_flags</span>
        <?php endif; ?>
      </div>

      <div class="mini-muted mb-3">Працює непомітно для звичайних людей: аналізує активність нових акаунтів, зовнішні посилання, повторюваний текст і стоп-слова. Контент не блокується — акаунт лише позначається в адмінці.</div>

      <div class="sec-stats mb-3">
        <div class="sec-stat"><div class="num"><?= (int)($antispamSettings['enabled'] ?? 0) === 1 ? 'ON' : 'OFF' ?></div><div class="lbl">Антиспам</div></div>
        <div class="sec-stat"><div class="num"><?= (int)($antispamStats['bot'] ?? 0) ?></div><div class="lbl">Позначені як боти</div></div>
        <div class="sec-stat"><div class="num"><?= (int)($antispamStats['suspect'] ?? 0) ?></div><div class="lbl">Підозрілі</div></div>
        <div class="sec-stat"><div class="num"><?= (int)($antispamSettings['new_account_window_min'] ?? 60) ?></div><div class="lbl">Вікно нового акаунта, хв</div></div>
      </div>

      <?php if (!$appSettingsOk): ?>
        <div class="sec-box mb-3">
          <div class="fw-bold mb-1">Потрібна таблиця app_settings</div>
          <div class="mini-muted">Налаштування антиспаму зберігаються в app_settings. Після створення таблиці форма стане повністю робочою.</div>
        </div>
      <?php endif; ?>

      <?php if (!$antispamFlagsOk): ?>
        <div class="sec-box mb-3">
          <div class="fw-bold mb-1">Потрібна таблиця security_antispam_flags</div>
          <div class="mini-muted">Після імпорту SQL користувачі почнуть позначатися автоматично, а статус з’явиться в /admin/users/.</div>
        </div>
      <?php endif; ?>

      <form method="post" action="/functional/security/anti_spam.php">
        <input type="hidden" name="action" value="save_settings">
        <input type="hidden" name="back" value="/admin/antispam/">
        <?php vm_csrf_field(); ?>

        <div class="row g-3">
          <div class="col-md-3">
            <label class="form-label small mb-1">Увімкнути</label>
            <div class="form-check form-switch mt-1">
              <input class="form-check-input" type="checkbox" name="enabled" value="1" id="as_enabled" <?= (int)($antispamSettings['enabled'] ?? 0) === 1 ? 'checked' : '' ?> <?= $appSettingsOk ? '' : 'disabled' ?>>
              <label class="form-check-label" for="as_enabled">Антиспам активний</label>
            </div>
          </div>
          <div class="col-md-3">
            <label class="form-label small mb-1">Статус після спрацювання</label>
            <select class="form-select form-select-sm" name="mark_status" <?= $appSettingsOk ? '' : 'disabled' ?>>
              <option value="bot" <?= (string)($antispamSettings['mark_status'] ?? 'bot') === 'bot' ? 'selected' : '' ?>>Бот</option>
              <option value="suspect" <?= (string)($antispamSettings['mark_status'] ?? '') === 'suspect' ? 'selected' : '' ?>>Підозрілий</option>
            </select>
          </div>
          <div class="col-md-3">
            <label class="form-label small mb-1">Нове вікно акаунта (хв)</label>
            <input class="form-control form-control-sm" type="number" name="new_account_window_min" value="<?= (int)($antispamSettings['new_account_window_min'] ?? 60) ?>" <?= $appSettingsOk ? '' : 'disabled' ?>>
          </div>
          <div class="col-md-3">
            <label class="form-label small mb-1">Ліміт постів</label>
            <input class="form-control form-control-sm" type="number" name="post_limit" value="<?= (int)($antispamSettings['post_limit'] ?? 5) ?>" <?= $appSettingsOk ? '' : 'disabled' ?>>
          </div>

          <div class="col-md-3">
            <label class="form-label small mb-1">Ліміт коментарів</label>
            <input class="form-control form-control-sm" type="number" name="comment_limit" value="<?= (int)($antispamSettings['comment_limit'] ?? 10) ?>" <?= $appSettingsOk ? '' : 'disabled' ?>>
          </div>
          <div class="col-md-3">
            <label class="form-label small mb-1">Ліміт зовнішніх посилань</label>
            <input class="form-control form-control-sm" type="number" name="link_limit" value="<?= (int)($antispamSettings['link_limit'] ?? 1) ?>" <?= $appSettingsOk ? '' : 'disabled' ?>>
          </div>
          <div class="col-md-3">
            <label class="form-label small mb-1">Ліміт однакового тексту</label>
            <input class="form-control form-control-sm" type="number" name="duplicate_text_limit" value="<?= (int)($antispamSettings['duplicate_text_limit'] ?? 2) ?>" <?= $appSettingsOk ? '' : 'disabled' ?>>
          </div>
          <div class="col-md-3">
            <label class="form-label small mb-1">Застосування стоп-слів</label>
            <div class="form-check mt-1"><input class="form-check-input" type="checkbox" id="sw_posts" name="stop_words_posts" value="1" <?= (int)($antispamSettings['stop_words_posts'] ?? 1) === 1 ? 'checked' : '' ?> <?= $appSettingsOk ? '' : 'disabled' ?>><label class="form-check-label" for="sw_posts">Для постів</label></div>
            <div class="form-check"><input class="form-check-input" type="checkbox" id="sw_comments" name="stop_words_comments" value="1" <?= (int)($antispamSettings['stop_words_comments'] ?? 1) === 1 ? 'checked' : '' ?> <?= $appSettingsOk ? '' : 'disabled' ?>><label class="form-check-label" for="sw_comments">Для коментарів</label></div>
          </div>

          <div class="col-12">
            <label class="form-label small mb-1">Стоп-слова / фрази (по одному на рядок)</label>
            <textarea class="form-control form-control-sm mono" name="stop_words" rows="8" <?= $appSettingsOk ? '' : 'disabled' ?>><?= h((string)($antispamSettings['stop_words'] ?? '')) ?></textarea>
            <div class="mini-muted mt-1">Можна вказувати слова, фрази, домени й фрагменти URL. Приклади: <span class="mono">whatsapp</span>, <span class="mono">t.me/</span>, <span class="mono">crypto</span>, <span class="mono">forex</span>.</div>
          </div>

          <div class="col-12 d-flex gap-2 flex-wrap">
            <button class="btn btn-sm btn-primary" <?= $appSettingsOk ? '' : 'disabled' ?>>Зберегти антиспам</button>
            <a class="btn btn-sm btn-outline-secondary" href="/admin/users/">Відкрити список користувачів</a>
          </div>
        </div>
      </form>
    </div>

    <div class="card card-app p-3">
      <div class="d-flex align-items-center justify-content-between mb-2">
        <div class="fw-bold">Останні позначення</div>
        <a class="btn btn-sm btn-outline-secondary" href="/admin/users/">Перейти до користувачів</a>
      </div>
      <div class="mini-muted mb-2">Останні записи з таблиці security_antispam_flags.</div>
      <div class="table-responsive">
        <table class="table table-sm align-middle mb-0">
          <thead>
            <tr>
              <th>Час</th>
              <th>Користувач</th>
              <th>Статус</th>
              <th>Код причини</th>
              <th>Опис</th>
            </tr>
          </thead>
          <tbody>
          <?php if (!$antispamFlagsOk): ?>
            <tr><td colspan="5" class="text-muted small">Таблиця security_antispam_flags ще не створена.</td></tr>
          <?php elseif (!$recentFlags): ?>
            <tr><td colspan="5" class="text-muted small">Поки що записів немає.</td></tr>
          <?php else: ?>
            <?php foreach ($recentFlags as $row): ?>
              <?php
                $userId = (int)($row['user_id'] ?? 0);
                $username = trim((string)($row['username'] ?? ''));
                $email = trim((string)($row['email'] ?? ''));
                $label = $username !== '' ? $username : ($email !== '' ? $email : ('ID ' . $userId));
                $status = (string)($row['status'] ?? 'suspect');
              ?>
              <tr>
                <td class="small text-muted"><?= h((string)($row['created_at'] ?? '')) ?></td>
                <td class="small">
                  <?php if ($userId > 0): ?>
                    <a href="/admin/users/edit.php?id=<?= $userId ?>"><?= h($label) ?></a>
                  <?php else: ?>
                    <?= h($label) ?>
                  <?php endif; ?>
                </td>
                <td class="small">
                  <?php if ($status === 'bot'): ?>
                    <span class="status-bot">🤖 Бот</span>
                  <?php else: ?>
                    <span class="status-suspect">⚠️ Підозрілий</span>
                  <?php endif; ?>
                </td>
                <td class="small mono"><?= h((string)($row['reason_code'] ?? '-')) ?></td>
                <td class="small"><?= h((string)($row['reason_text'] ?? '-')) ?></td>
              </tr>
            <?php endforeach; ?>
          <?php endif; ?>
          </tbody>
        </table>
      </div>
    </div>

  </div>
  <div class="col-lg-3"><?php admin_sidebar('antispam'); ?></div>
</div>

<?php require __DIR__ . '/../../includes/footer.php'; ?>
