"""
Fossati AI Bot — Backtest Runner (CLI)

Exemplos:
    python backtest_runner.py
    python backtest_runner.py --symbols BTCUSDT SOLUSDT --days 60
    python backtest_runner.py --interval 1h --days 180 --output bt_1h.json
"""

import argparse
import logging
import sys
from pathlib import Path

import config
from backtest import Backtester


def parse_args() -> argparse.Namespace:
    p = argparse.ArgumentParser(description="Fossati AI Bot — Backtest Runner")
    p.add_argument("--symbols", nargs="+", default=None,
                   help="Símbolos a testar (default: todos do config.SYMBOLS)")
    p.add_argument("--days", type=int, default=90, help="Janela em dias (default: 90)")
    p.add_argument("--interval", type=str, default="15m",
                   help="Intervalo de candle (default: 15m)")
    p.add_argument("--output", type=str, default="backtest_results.json",
                   help="Arquivo de saída JSON")
    p.add_argument("--initial-balance", type=float, default=None,
                   help="Saldo inicial (default: config.INITIAL_BALANCE)")
    return p.parse_args()


def _print_summary(result_path: Path) -> None:
    import json
    data = json.loads(result_path.read_text(encoding="utf-8"))
    print("\n" + "=" * 60)
    print(f"  RESULTADO BACKTEST · {data['period']}")
    print("=" * 60)
    print(f"  Símbolos:        {len(data['symbols'])}")
    print(f"  Trades totais:   {data['total_trades']}  "
          f"(W:{data['winning_trades']}  L:{data['losing_trades']})")
    print(f"  Win rate:        {data['win_rate']}%")
    print(f"  P&L total:       {data['total_pnl_pct']}%  "
          f"(${data['total_pnl_usdt']:.2f})")
    print(f"  Max drawdown:    {data['max_drawdown_pct']}%")
    print(f"  Profit factor:   {data['profit_factor']}")
    print(f"  Sharpe:          {data['sharpe_ratio']}")
    print(f"  SQN:             {data['sqn']}")
    print(f"  Avg bars held:   {data['avg_bars_held']}")
    print("-" * 60)
    by = data.get("by_symbol", {})
    for sym, s in sorted(by.items(), key=lambda kv: kv[1]["pnl_pct"], reverse=True):
        print(f"  {sym:<14} {s['trades']:>3}t  WR {s['win_rate']:>5}%  "
              f"PnL {s['pnl_pct']:>+8.2f}%  ${s['pnl_usdt']:>+8.2f}")
    print("=" * 60)
    print(f"  Saída: {result_path.resolve()}\n")


def main() -> int:
    args = parse_args()

    logging.basicConfig(
        level=logging.INFO,
        format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
        handlers=[logging.StreamHandler(stream=sys.stdout)],
    )

    bt = Backtester(
        symbols=args.symbols,
        days=args.days,
        interval=args.interval,
        initial_balance=args.initial_balance,
    )
    bt.run()
    out = bt.save(args.output)
    _print_summary(out)
    return 0


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