from __future__ import annotations

from historical_replay import Candle, aggregate_trade_breakdowns, run_walk_forward_tournament
from strategy_registry import StrategyPreset


def _candle(i: int, close: float) -> Candle:
    return Candle(ts=1_700_000_000 + i * 60, open=close, high=close, low=close, close=close, volume=1_000_000)


def _preset(strategy_id: str, trigger: float = 4.5) -> StrategyPreset:
    return StrategyPreset(
        strategy_id=strategy_id,
        label=strategy_id,
        source="unit",
        parameters={
            "flash_crash_trigger_pct": trigger,
            "break_even_activation_pct": 0.4,
            "v_shape_activation_pct": 1.0,
            "v_shape_trail_dist_pct": 0.5,
            "dead_fish_time_limit_mins": 30,
            "atr_sl_multiplier": 2.0,
            "max_hard_stop_pct": 3.0,
            "trade_size_usd": 50.0,
            "default_leverage": 5,
            "min_volume_24h": 1,
        },
    )


def test_aggregate_trade_breakdowns_groups_by_coin_and_exit_reason() -> None:
    candles = {
        "BTC": [_candle(0, 100), _candle(1, 100), _candle(2, 95), _candle(3, 96.5), _candle(4, 96.0)],
        "ETH": [_candle(0, 100), _candle(1, 100), _candle(2, 95), _candle(3, 90), _candle(4, 89)],
    }

    results = run_walk_forward_tournament([_preset("candidate")], candles, volumes={"BTC": 9_000_000, "ETH": 9_000_000}, segments=1)
    breakdown = aggregate_trade_breakdowns(results[0].aggregate.trades)

    assert set(breakdown.by_coin) == {"BTC", "ETH"}
    assert breakdown.by_coin["BTC"].closed_trades == 1
    assert breakdown.by_coin["ETH"].closed_trades == 1
    assert any(reason.startswith("V-Shape") for reason in breakdown.by_exit_reason)
    assert any(reason.startswith("SL Hit") for reason in breakdown.by_exit_reason)


def test_walk_forward_tournament_reports_segments_and_stability() -> None:
    candles = {
        "BTC": [
            _candle(0, 100), _candle(1, 100), _candle(2, 95), _candle(3, 96.5), _candle(4, 96),
            _candle(5, 96), _candle(6, 96), _candle(7, 96), _candle(8, 96), _candle(9, 96),
        ],
        "ETH": [
            _candle(0, 100), _candle(1, 100), _candle(2, 100), _candle(3, 100), _candle(4, 100),
            _candle(5, 100), _candle(6, 100), _candle(7, 95), _candle(8, 90), _candle(9, 89),
        ],
    }

    results = run_walk_forward_tournament([_preset("wf")], candles, volumes={"BTC": 9_000_000, "ETH": 9_000_000}, segments=2)

    assert results[0].strategy_id == "wf"
    assert len(results[0].segments) == 2
    assert results[0].aggregate.closed_trades == 2
    assert results[0].winning_segments == 1
    assert results[0].losing_segments == 1
    assert results[0].stability_score == 0.5
