from __future__ import annotations

from pathlib import Path
import sys

from multi_strategy_launcher import build_strategy_env, build_strategy_command_plan
from strategy_registry import StrategyPreset


def test_build_strategy_env_maps_parameters_to_ctb_variables(tmp_path: Path) -> None:
    preset = StrategyPreset(
        strategy_id="demo",
        label="Demo",
        source="unit",
        parameters={"flash_crash_trigger_pct": 5.5, "dead_fish_time_limit_mins": 22, "trade_size_usd": 12.5, "crash_roe_trigger_pct": 9.0, "strategy_family": "volatility_squeeze_breakout", "squeeze_breakout_pct": 1.2, "position_sizing_mode": "risk", "wallet_equity_usdc": 500.0, "risk_per_trade_pct": 0.75, "allowed_coins": ("WLD", "SUI")},
    )

    env = build_strategy_env(preset, tmp_path)

    assert env["CTB_RUNTIME_DIR"] == str(tmp_path / "experiments" / "demo")
    assert env["CTB_PAPER_TRADING"] == "true"
    assert env["CTB_DRY_RUN"] == "false"
    assert env["CTB_FLASH_CRASH_TRIGGER_PCT"] == "5.5"
    assert env["CTB_DEAD_FISH_TIME_LIMIT_MINS"] == "22"
    assert env["CTB_TRADE_SIZE_USD"] == "12.5"
    assert env["CTB_CRASH_ROE_TRIGGER_PCT"] == "9.0"
    assert env["CTB_STRATEGY_FAMILY"] == "volatility_squeeze_breakout"
    assert env["CTB_SQUEEZE_BREAKOUT_PCT"] == "1.2"
    assert env["CTB_POSITION_SIZING_MODE"] == "risk"
    assert env["CTB_WALLET_EQUITY_USDC"] == "500.0"
    assert env["CTB_RISK_PER_TRADE_PCT"] == "0.75"
    assert env["CTB_ALLOWED_COINS"] == "WLD,SUI"
    assert env["PYTHONUNBUFFERED"] == "1"


def test_build_strategy_command_plan_limits_parallel_processes(tmp_path: Path) -> None:
    presets = [
        StrategyPreset(strategy_id="a", label="A", source="unit", parameters={}),
        StrategyPreset(strategy_id="b", label="B", source="unit", parameters={}),
        StrategyPreset(strategy_id="c", label="C", source="unit", parameters={}),
    ]

    plan = build_strategy_command_plan(presets, tmp_path, max_parallel=2)

    assert [item.strategy_id for item in plan] == ["a", "b"]
    assert all(item.command == [sys.executable, "AutoTrader.py"] for item in plan)
    assert all(item.env["CTB_PAPER_TRADING"] == "true" for item in plan)
