from __future__ import annotations

from src.strategies.strategy_sleeves import build_sleeve_scorecard, format_sleeve_scorecard, list_strategy_sleeves


def test_strategy_sleeves_are_separated_and_never_live_enabled() -> None:
    sleeves = list_strategy_sleeves()

    assert [row["sleeve_id"] for row in sleeves] == [
        "intraday_v76_strict",
        "swing_trend_retest",
        "portfolio_holding_advisor",
    ]
    assert {row["horizon"] for row in sleeves} == {"intraday", "swing", "portfolio"}
    assert all(row["live_order_allowed"] is False for row in sleeves)
    assert all(row["mainnet_signed_action"] is False for row in sleeves)


def test_sleeve_scorecard_uses_lifecycle_for_intraday_and_blocks_missing_sleeves(tmp_path) -> None:
    payload = build_sleeve_scorecard(
        lifecycle_summary={"open_positions": 1},
        lifecycle_scorecard={
            "evidence_source": "true_lifecycle_exits_only",
            "closed_trades": 42,
            "winrate_pct": "47.50",
            "profit_factor": "0.90",
            "net_pnl_usd": "-1.25",
            "blockers": ["lifecycle_pnl_not_positive"],
        },
        runtime_dir=tmp_path,
    )

    assert payload["version"] == "strategy_sleeves.v1"
    assert payload["live_allowed"] is False
    cards = {row["sleeve_id"]: row for row in payload["sleeves"]}
    assert cards["intraday_v76_strict"]["status"] == "Blocked"
    assert cards["intraday_v76_strict"]["closed_trades"] == 42
    assert cards["intraday_v76_strict"]["open_positions"] == 1
    assert cards["intraday_v76_strict"]["live_allowed"] is False
    assert cards["swing_trend_retest"]["status"] == "Research"
    assert "no_swing_retest_entries_yet" in cards["swing_trend_retest"]["blockers"]
    assert "research_only_no_live_authority" in cards["swing_trend_retest"]["blockers"]
    assert cards["portfolio_holding_advisor"]["status"] == "Advisor"
    assert "advisor_only_no_execution" in cards["portfolio_holding_advisor"]["blockers"]

    line = format_sleeve_scorecard(payload)
    assert "Strategy Sleeves v1:" in line
    assert "intraday_v76_strict=Blocked" in line
    assert "swing_trend_retest=Research" in line
    assert "portfolio_holding_advisor=Advisor" in line
    assert "live=nein" in line
