<?php
/**
 * AJAX-обработчики настроек кабинета VK-лидгена:
 *   settings_save  — сохранить промпты и тексты
 *   prompts_reset  — вернуть промпты к значениям по умолчанию
 *   schedule_save  — сохранить расписание модуля (вкл/выкл, дата, периодичность, окно часов)
 *   run_now        — поставить модуль в очередь на запуск
 *   stop_run       — мягкая остановка (модуль выйдет после текущего контакта)
 *   force_stop     — принудительная остановка процесса
 *   runs_status    — статусы для автообновления страницы
 */
declare(strict_types=1);
if (empty($_SESSION['vk_ok'])) {
    json_out(['ok' => false, 'error' => 'нет доступа']);
}

function sng_setting(PDO $pdo, string $k, string $d = ''): string {
    $st = $pdo->prepare('SELECT value FROM settings WHERE key = ?');
    $st->execute([$k]);
    $v = $st->fetchColumn();
    return ($v === false || $v === null) ? $d : (string)$v;
}

$MODULES = [
    'friend_followup' => ['Добор заявок', 'досылает заявки в друзья тем, кого прокомментировали'],
    'replies'       => ['Ответы на входящие', 'отвечает тем, кто написал в личку первым'],
    'friends_check' => 'Проверка друзей',
    'comments'      => 'Комментарии',
    'messages'      => 'Сообщения',
    'cleanup'       => 'Чистка заявок',
];

if ($action === 'settings_save') {
    $pairs = json_decode(post('data', '{}'), true) ?: [];
    $allowed = ['niche', 'about_owner', 'prompt_filter', 'prompt_comment', 'prompt_message',
        'prompt_profile', 'prompt_activity', 'posts_per_contact', 'keep_base_requests', 'keep_fresh_requests',
        'run_limit', 'start_from_date', 'strict_niche', 'niche_keywords',
        'pause_action_min', 'pause_action_max', 'pause_post_min', 'pause_post_max',
        'pause_contact_min', 'pause_contact_max', 'min_request_interval', 'process_order', 'posts_scan',
        'pause_cleanup_min', 'pause_cleanup_max', 'pause_friend_min', 'pause_friend_max',
        'friend_requests_per_day', 'limit_replies', 'reply_max_age_days',
        'llm_provider', 'llm_model_deepseek'];
    foreach ($allowed as $k) {
        if (array_key_exists($k, $pairs)) {
            db_set($pdo, $k, (string)$pairs[$k]);
        }
    }
    foreach (array_keys($MODULES) as $m) {
        if (array_key_exists("limit_$m", $pairs)) db_set($pdo, "limit_$m", (string)(int)$pairs["limit_$m"]);
        if (array_key_exists("run_minutes_$m", $pairs)) db_set($pdo, "run_minutes_$m", (string)max(0, (int)$pairs["run_minutes_$m"]));
    }
    json_out(['ok' => true]);
}

if ($action === 'prompts_reset') {
    $file = '/opt/vk-leadgen/data/prompt_defaults.json';
    $def = is_readable($file) ? (json_decode((string)file_get_contents($file), true) ?: []) : [];
    foreach ($def as $k => $v) {
        db_set($pdo, $k, (string)$v);
    }
    json_out(['ok' => true, 'restored' => count($def)]);
}

if ($action === 'schedule_save') {
    $m = post('module');
    if (!isset($MODULES[$m])) json_out(['ok' => false, 'error' => 'неизвестный модуль']);
    db_set($pdo, "sched_enabled_$m", post('enabled') === '1' ? '1' : '0');
    $start = post('start');
    if ($start !== '' && !preg_match('/^\d{4}-\d{2}-\d{2}$/', $start)) $start = '';
    db_set($pdo, "sched_start_$m", $start);
    db_set($pdo, "sched_period_$m", (string)max(1, (int)post('period', '2')));
    $t = post('time');
    if (!preg_match('/^\d{2}:\d{2}$/', $t)) $t = '10:00';
    db_set($pdo, "sched_time_$m", $t);
    db_set($pdo, "sched_from_$m", (string)max(0, min(23, (int)post('from', '9'))));
    db_set($pdo, "sched_to_$m", (string)max(1, min(24, (int)post('to', '20'))));
    json_out(['ok' => true]);
}

if ($action === 'unblock_vk') {      // снять блокировку дня (если владелец уверен, что лимит сброшен)
    $pdo->prepare("INSERT INTO settings (key,value) VALUES ('vk_limit_date','') ON CONFLICT(key) DO UPDATE SET value=''")->execute();
    $pdo->prepare("INSERT INTO settings (key,value) VALUES ('vk_limit_reason','') ON CONFLICT(key) DO UPDATE SET value=''")->execute();
    json_out(['ok' => true]);
}

if ($action === 'run_now') {
    $m = post('module');
    if (!isset($MODULES[$m])) json_out(['ok' => false, 'error' => 'неизвестный модуль']);
    // лимит ВК: сегодня действия не выполняем (владелец может снять блокировку кнопкой)
    $lim = (string)sng_setting($pdo, 'vk_limit_date', '');
    if ($lim === date('Y-m-d', time() + 3 * 3600)) {
        json_out(['ok' => false, 'error' => 'ВК ограничил действия до конца дня (' . sng_setting($pdo, 'vk_limit_reason', 'flood control')
            . '). Запуски остановлены. Если уверены, что лимит сброшен — нажмите «Снять блокировку».']);
    }
    $busy = $pdo->query("SELECT module, id FROM module_runs WHERE status IN ('running','stopping') ORDER BY id DESC LIMIT 1")->fetch();
    if ($busy) {
        json_out(['ok' => false, 'error' => 'сейчас уже работает «' . ($MODULES[$busy['module']] ?? $busy['module']) . '» — дождитесь окончания']);
    }
    // окно работы модуля (МСК) — вне него ВК-действия запрещены
    $hFrom = (int)(sng_setting($pdo, "sched_from_$m", '9'));
    $hTo = min(22, (int)(sng_setting($pdo, "sched_to_$m", '20')));
    $nowH = ((int)date('G') + 3) % 24;   // сервер в UTC, показываем МСК
    if ($nowH < $hFrom || $nowH >= $hTo) {
        json_out(['ok' => false, 'error' => sprintf(
            'Сейчас %02d:00 МСК, а окно работы этого модуля — %02d:00–%02d:00. Измените окно в расписании или запустите в рабочее время.',
            $nowH, $hFrom, $hTo)]);
    }
    $limit = max(0, (int)post('limit', '0'));
    $st = $pdo->prepare("INSERT INTO module_runs (module, source, status, limit_n, requested_at) VALUES (?,?,?,?,?)");
    $st->execute([$m, 'manual', 'queued', $limit, date('Y-m-d H:i:s')]);
    json_out(['ok' => true, 'queued' => (int)$pdo->lastInsertId(), 'note' => 'запуск начнётся в течение 5 секунд']);
}

if ($action === 'stop_run' || $action === 'force_stop') {
    $m = post('module');
    if (!isset($MODULES[$m])) json_out(['ok' => false, 'error' => 'неизвестный модуль']);
    if ($action === 'force_stop') {
        db_set($pdo, "force_stop_$m", '1');
        json_out(['ok' => true, 'note' => 'процесс будет снят принудительно']);
    }
    db_set($pdo, "stop_$m", '1');
    json_out(['ok' => true, 'note' => 'модуль остановится после текущего контакта (до 1 минуты)']);
}

if ($action === 'runs_status') {
    $rows = $pdo->query("SELECT * FROM module_runs ORDER BY id DESC LIMIT 40")->fetchAll();
    $running = null;
    foreach ($rows as $r) {
        if (in_array($r['status'], ['running', 'stopping'], true)) { $running = $r; break; }
    }
    $out = [];
    foreach (array_keys($MODULES) as $m) {
        $last = null;
        foreach ($rows as $r) {
            if ($r['module'] === $m) { $last = $r; break; }
        }
        $out[$m] = [
            'status' => $last['status'] ?? null,
            'started' => $last['started_at'] ?? null,
            'finished' => $last['finished_at'] ?? null,
            'report' => $last['report'] ?? null,
            'exit_code' => $last['exit_code'] ?? null,
            'is_running' => $running && $running['module'] === $m,
        ];
    }
    json_out(['ok' => true, 'running' => $running ? ['module' => $running['module'], 'status' => $running['status'], 'started' => $running['started_at']] : null,
        'modules' => $out]);
}

json_out(['ok' => false, 'error' => 'неизвестное действие']);
