from __future__ import annotations

import argparse
from decimal import Decimal
import json

from src.execution.order_intent import OrderIntent
from src.execution.payloads import prepare_order_payload
from src.hyperliquid.rounding import HyperliquidAssetMeta


def build_payload_smoke(coin: str, side: str, notional: Decimal) -> dict:
    price = Decimal("100000") if coin.upper() == "BTC" else Decimal("100")
    size = notional / price
    intent = OrderIntent(
        strategy_id="candidate_v76_hl_confirmed_squeeze_hybrid",
        symbol=f"{coin.upper()}/USDC:USDC",
        coin=coin.upper(),
        side=side,  # type: ignore[arg-type]
        reduce_only=False,
        order_type="market",
        tif="Ioc",
        size=size,
        price=None,
        trigger_price=None,
        stop_loss=price * Decimal("0.99") if side == "buy" else price * Decimal("1.01"),
        take_profit=price * Decimal("1.02") if side == "buy" else price * Decimal("0.98"),
        client_order_id=f"payload-smoke-{coin.upper()}",
        reason="payload_smoke",
        risk_usd=Decimal("1.25"),
        estimated_notional_usd=notional,
    )
    prepared = prepare_order_payload(intent, HyperliquidAssetMeta(coin.upper(), 0, 5), min_notional_usd=Decimal("10"))
    return {"accepted": prepared.accepted, "reasons": prepared.reasons, "payload": prepared.payload, "stop_loss_payload": prepared.stop_loss_payload, "take_profit_payload": prepared.take_profit_payload}


def main(argv: list[str] | None = None) -> int:
    parser = argparse.ArgumentParser(description="Build Hyperliquid order payload only; no API key and no exchange call.")
    parser.add_argument("--coin", required=True)
    parser.add_argument("--side", choices=["buy", "sell"], default="buy")
    parser.add_argument("--notional", required=True, type=Decimal)
    parser.add_argument("--dry-run", action="store_true", required=True)
    args = parser.parse_args(argv)
    print(json.dumps(build_payload_smoke(args.coin, args.side, args.notional), indent=2, default=str, sort_keys=True))
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
