from config import BotConfig
from historical_replay import Candle


def test_leverage_normalized_threshold_gets_stricter_for_low_leverage_coin():
    from near_miss import effective_required_drop_pct, roe_crash_required_drop_pct

    cfg = BotConfig(flash_crash_trigger_pct=4.5, crash_roe_trigger_pct=15.0, default_leverage=5, leverage_by_coin={"HYPE": 3})

    assert roe_crash_required_drop_pct(cfg, "BTC") == 3.0
    assert effective_required_drop_pct(cfg, "BTC") == 4.5
    assert roe_crash_required_drop_pct(cfg, "HYPE") == 5.0
    assert effective_required_drop_pct(cfg, "HYPE") == 5.0


def test_flash_crash_entry_uses_coin_specific_leverage_threshold():
    from strategy import should_enter_flash_crash

    cfg = BotConfig(flash_crash_trigger_pct=4.5, crash_roe_trigger_pct=15.0, default_leverage=5, leverage_by_coin={"HYPE": 3}, min_volume_24h=1)
    history = [(1.0, 100.0), (2.0, 95.2)]

    decision = should_enter_flash_crash(
        coin="HYPE",
        history=history,
        current_price=95.2,
        volume_24h=10,
        baseline_price=100.0,
        open_positions=set(),
        cooldowns={},
        now_ts=10.0,
        cfg=cfg,
    )

    assert decision.enter is False
    assert decision.reason == "no_flash_crash"
    assert decision.leverage == 3
    assert decision.required_drop_pct == 5.0


def test_near_miss_event_records_roe_distance():
    from near_miss import build_near_miss_event

    cfg = BotConfig(flash_crash_trigger_pct=4.5, crash_roe_trigger_pct=15.0, default_leverage=5)
    event = build_near_miss_event(strategy_id="test", coin="BTC", history=[(1.0, 100.0), (2.0, 96.0)], current_price=96.0, reason="no_flash_crash", cfg=cfg, now_ts=2.0)

    assert event is not None
    assert event.drop_pct == -4.0
    assert event.roe_drop_pct == -20.0
    assert event.required_drop_pct == 4.5
    assert event.distance_pct == 0.5


def test_crash_frequency_counts_distinct_events():
    from crash_frequency import count_crash_events

    cfg = BotConfig(flash_crash_trigger_pct=4.5, crash_roe_trigger_pct=15.0, default_leverage=5)
    candles = [
        Candle(ts=0, open=100, high=100, low=100, close=100),
        Candle(ts=300, open=100, high=100, low=95, close=95),
        Candle(ts=600, open=95, high=96, low=95, close=95.5),
        Candle(ts=900, open=95.5, high=101, low=100, close=101),
        Candle(ts=1200, open=101, high=101, low=96, close=96),
    ]

    result = count_crash_events("BTC", candles, cfg=cfg, window_minutes=15, interval_minutes=5)

    assert result.events == 2
    assert result.worst_drop_pct <= -5.0
