from datetime import datetime, timezone


def test_compute_chart_indicators_for_uptrend():
    from market_context import compute_chart_indicators

    candles = [
        {"open": i, "high": i + 2, "low": i - 1, "close": i + 1, "volume": 100 + i}
        for i in range(1, 31)
    ]

    indicators = compute_chart_indicators(candles)

    assert indicators.sma_fast > indicators.sma_slow
    assert indicators.rsi_14 > 50
    assert indicators.atr_14 > 0
    assert indicators.bollinger_upper > indicators.bollinger_lower
    assert indicators.vwap > 0


def test_context_snapshot_classifies_market_context():
    from market_context import build_market_context_snapshot

    candles = [
        {"open": 100 + i, "high": 103 + i, "low": 99 + i, "close": 102 + i, "volume": 1000 + i}
        for i in range(40)
    ]

    snapshot = build_market_context_snapshot(
        coin="BTC",
        candles=candles,
        open_interest_usd=1_000_000,
        funding_rate=0.0001,
        source="hyperliquid",
    )

    assert snapshot.coin == "BTC"
    assert snapshot.source == "hyperliquid"
    assert snapshot.indicators.sma_fast > snapshot.indicators.sma_slow
    assert "trend_up" in snapshot.tags
    assert snapshot.reliability_score > 0.5
    assert snapshot.as_event()["event_type"] == "market_context"


def test_signal_reliability_scores_historical_predictiveness():
    from market_context import score_signal_reliability

    observations = [
        {"source": "listing_news", "predicted_direction": "up", "actual_return_pct": 3.0},
        {"source": "listing_news", "predicted_direction": "up", "actual_return_pct": 1.0},
        {"source": "listing_news", "predicted_direction": "down", "actual_return_pct": -2.0},
        {"source": "rumor", "predicted_direction": "up", "actual_return_pct": -4.0},
    ]

    scores = score_signal_reliability(observations)

    assert scores["listing_news"].sample_size == 3
    assert scores["listing_news"].hit_rate == 1.0
    assert scores["listing_news"].avg_return_pct > 0
    assert scores["rumor"].hit_rate == 0.0


def test_append_market_context_event_writes_jsonl(tmp_path):
    from market_context import MarketContextSnapshot, ChartIndicators, append_market_context_event

    snapshot = MarketContextSnapshot(
        ts=datetime(2026, 1, 1, tzinfo=timezone.utc),
        coin="ETH",
        source="hyperliquid",
        timeframe="15m",
        indicators=ChartIndicators(sma_fast=10, sma_slow=9, rsi_14=55, atr_14=1.2, bollinger_upper=12, bollinger_lower=8, vwap=10.2),
        open_interest_usd=123,
        funding_rate=0.01,
        tags=("trend_up",),
        reliability_score=0.8,
    )

    path = tmp_path / "market_context.jsonl"
    append_market_context_event(path, snapshot)

    text = path.read_text()
    assert '"event_type": "market_context"' in text
    assert '"coin": "ETH"' in text
