<?php
// =============================================================
// PRICE FETCHER — текущая mid price символа с Hyperliquid
// =============================================================

require_once __DIR__ . '/config.php';
require_once __DIR__ . '/logger.php';
require_once __DIR__ . '/collector.php';


/**
 * Возвращает mid price (между bid/ask) для символа.
 * Использует allMids endpoint — один запрос даёт цены всех символов.
 * Результат allMids кэшируется на весь цикл выполнения (один процесс
 * bot.php = один запрос allMids, независимо от числа кошельков/сигналов).
 * Возвращает null при ошибке.
 */
function fetch_mid_price(string $symbol): ?float
{
    $prices = fetch_all_mids();

    if ($prices === null) {
        return null;
    }

    if (!isset($prices[$symbol])) {
        bot_log('PRICE: no mid price for ' . $symbol);
        return null;
    }

    return (float) $prices[$symbol];
}

/**
 * Получает все mid prices. Кэшируется в статической переменной —
 * реальный HTTP-запрос к API делается максимум один раз за процесс
 * (один проход cron по всем кошелькам), дальше используется кэш.
 * Возвращает массив ['BTC' => 67500.0, 'ETH' => 3500.0, ...] или null.
 */
function fetch_all_mids(bool $reset = false): ?array
{
    static $cachedPrices = null;
    static $fetched = false;

    if ($reset) {
        $cachedPrices = null;
        $fetched      = false;
        return null;
    }

    if ($fetched) {
        return $cachedPrices;
    }

    $payload = json_encode(['type' => 'allMids']);

    $result = api_post(HL_API_URL, $payload);

    if ($result === null || !is_array($result)) {
        bot_log('PRICE: failed to fetch allMids');
        $fetched = true;
        $cachedPrices = null;
        return null;
    }

    // allMids возвращает плоский объект { "BTC": "67500.0", "ETH": "3500.0", ... }
    $prices = [];
    foreach ($result as $coin => $price) {
        $prices[strtoupper($coin)] = (float) $price;
    }

    $cachedPrices = $prices;
    $fetched = true;

    return $prices;
}

/**
 * Сбрасывает кэш цен между итерациями цикла.
 * Вызывается в начале каждой итерации в bot.php — без этого все циклы
 * работали бы с ценами первой итерации.
 */
function fetch_reset_price_cache(): void
{
    // Сбрасываем статические переменные через повторный вызов с флагом reset.
    // PHP не позволяет сбросить static напрямую извне функции,
    // поэтому fetch_all_mids() проверяет глобальный флаг.
    fetch_all_mids(true);
}
