from decimal import Decimal

from src.strategies.v76_fee_aware_anti_chase import (
    AntiChaseContext,
    FillHistoryRow,
    build_fee_aware_anti_chase_intent,
    evaluate_recent_fill_history,
)


def base_context(**overrides):
    data = {
        "coin": "BTC",
        "symbol": "BTC/USDC:USDC",
        "current_price": Decimal("100"),
        "recent_high": Decimal("101"),
        "retest_low": Decimal("99.20"),
        "sma_fast": Decimal("99.60"),
        "sma_slow": Decimal("98.90"),
        "atr_pct": Decimal("1.20"),
        "move_15m_pct": Decimal("0.35"),
        "move_1h_pct": Decimal("1.10"),
        "pullback_from_high_pct": Decimal("0.99"),
        "breadth_positive_candidates": 5,
        "relative_strength_rank": 2,
        "volume_24h": Decimal("100000000"),
        "spread_pct": Decimal("0.01"),
        "expected_slippage_pct": Decimal("0.02"),
        "funding_rate_hourly_pct": Decimal("0.0005"),
        "wallet_equity_usdc": Decimal("100"),
        "data_quality_allowed": True,
    }
    data.update(overrides)
    return AntiChaseContext(**data)


def test_fee_aware_anti_chase_rejects_entry_after_overextended_breakout():
    ctx = base_context(
        current_price=Decimal("104"),
        recent_high=Decimal("104.1"),
        move_15m_pct=Decimal("2.80"),
        move_1h_pct=Decimal("5.60"),
        pullback_from_high_pct=Decimal("0.10"),
    )

    intent = build_fee_aware_anti_chase_intent(ctx, client_order_id="anti-BTC-1")

    assert intent is None


def test_fee_aware_anti_chase_accepts_retest_after_breakout_holds():
    ctx = base_context()

    intent = build_fee_aware_anti_chase_intent(ctx, client_order_id="anti-BTC-2")

    assert intent is not None
    assert intent.strategy_id == "candidate_v76_fee_aware_anti_chase"
    assert intent.reason == "fee_aware_breakout_retest"
    assert intent.estimated_notional_usd >= Decimal("10")
    assert intent.stop_loss < ctx.retest_low


def test_fee_aware_anti_chase_blocks_when_expected_edge_does_not_clear_costs():
    ctx = base_context(
        spread_pct=Decimal("0.12"),
        expected_slippage_pct=Decimal("0.08"),
        atr_pct=Decimal("0.35"),
    )

    assert build_fee_aware_anti_chase_intent(ctx, client_order_id="anti-BTC-3") is None


def test_recent_fill_history_evaluation_flags_live_edge_failure_and_bad_timing():
    rows = [
        FillHistoryRow(coin="SOL", side="A", px=Decimal("66.531"), sz=Decimal("0.22"), closed_pnl=Decimal("-0.1859"), fee=Decimal("0.006323"), minutes_held=Decimal("12")),
        FillHistoryRow(coin="BTC", side="A", px=Decimal("62504"), sz=Decimal("0.00019"), closed_pnl=Decimal("-0.15143"), fee=Decimal("0.005130"), minutes_held=Decimal("18")),
        FillHistoryRow(coin="LINK", side="A", px=Decimal("7.952"), sz=Decimal("1.4"), closed_pnl=Decimal("0.16618"), fee=Decimal("0.004809"), minutes_held=Decimal("260")),
        FillHistoryRow(coin="SOL", side="A", px=Decimal("66.797"), sz=Decimal("0.16"), closed_pnl=Decimal("0.204"), fee=Decimal("0.004617"), minutes_held=Decimal("255")),
    ]

    report = evaluate_recent_fill_history(rows)

    assert report["status"] == "edge_failure"
    assert report["closed_count"] == 4
    assert report["win_rate_pct"] == Decimal("50.00")
    assert report["short_hold_net_pnl"] < 0
    assert "short_holds_negative" in report["blockers"]
    assert "sample_too_small" in report["blockers"]
    assert report["recommendation"] == "keep_live_entries_blocked"
