<?php
// STORAGE/WALLET_SYNC — last_sync для батч-распределения
require_once __DIR__ . '/db.php';

// ===============================================================
// WALLET SYNC — last_sync для распределения нагрузки
// ===============================================================

/**
 * Обновляет время последней синхронизации кошелька.
 * Вызывается из bot.php после обработки каждого кошелька.
 */
function storage_update_wallet_sync(string $walletId): void
{
    $db = storage_db();
    $db->prepare('
        INSERT INTO wallet_sync (wallet_id, last_sync)
        VALUES (?, ?)
        ON CONFLICT(wallet_id) DO UPDATE SET last_sync = excluded.last_sync
    ')->execute([$walletId, time()]);
}

/**
 * Возвращает wallet_id кошельков, которым ПОРА опрашивать fills,
 * отсортированных по last_sync ASC. Используется батч-планировщиком.
 *
 * Кошелёк с индивидуальным интервалом опроса (poll_interval_minutes > 0)
 * попадает в выдачу только когда с его последнего опроса прошло не меньше
 * интервала — до этого он не занимает слот батча и не тратит вес API.
 *
 * @param array $walletIds        все включённые wallet_id
 * @param int   $limit            сколько вернуть (0 = все)
 * @param array $minIntervalsSec  wallet_id => мин. секунд между опросами
 *                                (0/отсутствует = опрашивать каждый цикл)
 * @param int|null $now           текущее время (для тестов)
 * @return array                  wallet_id в порядке приоритета
 */
function storage_get_wallets_by_sync_priority(
    array $walletIds,
    int $limit = 0,
    array $minIntervalsSec = [],
    ?int $now = null
): array {
    if (empty($walletIds)) {
        return [];
    }

    $db  = storage_db();
    $now = $now ?? time();

    // Получаем last_sync для всех кошельков одним запросом
    $placeholders = implode(',', array_fill(0, count($walletIds), '?'));
    $stmt = $db->prepare(
        "SELECT wallet_id, last_sync FROM wallet_sync WHERE wallet_id IN ($placeholders)"
    );
    $stmt->execute(array_values($walletIds));
    $syncMap = [];
    foreach ($stmt->fetchAll() as $row) {
        $syncMap[$row['wallet_id']] = (int) $row['last_sync'];
    }

    // Кошельки без записи в wallet_sync получают last_sync = 0 (пора сразу).
    // Кошельки, чей интервал опроса ещё не истёк, в выдачу не попадают.
    $result = [];
    foreach ($walletIds as $id) {
        $lastSync = $syncMap[$id] ?? 0;
        $interval = max(0, (int) ($minIntervalsSec[$id] ?? 0));
        if ($interval > 0 && ($now - $lastSync) < $interval) {
            continue;
        }
        $result[$id] = $lastSync;
    }

    // Сортируем по last_sync ASC (давно не синхронизированные — первые)
    asort($result);
    $sorted = array_keys($result);

    return $limit > 0 ? array_slice($sorted, 0, $limit) : $sorted;
}
