from __future__ import annotations

from market_data_cache import BaselinePriceCache, should_log_error


def test_baseline_price_cache_reuses_value_until_ttl() -> None:
    calls = []

    def fetcher(coin: str) -> float:
        calls.append(coin)
        return 100.0 + len(calls)

    cache = BaselinePriceCache(ttl_seconds=60)

    assert cache.get("BTC", now_ts=1000, fetcher=fetcher) == 101.0
    assert cache.get("BTC", now_ts=1020, fetcher=fetcher) == 101.0
    assert cache.get("BTC", now_ts=1061, fetcher=fetcher) == 102.0
    assert calls == ["BTC", "BTC"]


def test_baseline_price_cache_keeps_previous_value_on_fetch_error() -> None:
    values = [100.0, RuntimeError("network down")]

    def fetcher(_coin: str) -> float:
        value = values.pop(0)
        if isinstance(value, Exception):
            raise value
        return value

    cache = BaselinePriceCache(ttl_seconds=10)

    assert cache.get("ETH", now_ts=1, fetcher=fetcher) == 100.0
    assert cache.get("ETH", now_ts=20, fetcher=fetcher) == 100.0


def test_should_log_error_throttles_repeated_messages() -> None:
    last_log: dict[str, float] = {}

    assert should_log_error("BTC", now_ts=0, last_log=last_log, interval_seconds=60) is True
    assert should_log_error("BTC", now_ts=10, last_log=last_log, interval_seconds=60) is False
    assert should_log_error("BTC", now_ts=61, last_log=last_log, interval_seconds=60) is True
