"""
=========================================
CV6 AI Trading OS — Backtest Router
All /backtest/* API endpoints.

Endpoints:
  POST /backtest/start          — start new session
  POST /backtest/pause          — pause
  POST /backtest/resume         — resume
  POST /backtest/stop           — stop
  POST /backtest/speed          — set replay speed
  GET  /backtest/status/{id}    — session status
  GET  /backtest/next/{id}      — advance one candle (REPLAY)
  GET  /backtest/prev/{id}      — go back one candle (REPLAY)
  GET  /backtest/state/{id}     — current replay state
  GET  /backtest/report/{id}    — full analytics report
  GET  /backtest/journal/{id}   — trade journal
  GET  /backtest/sessions       — list all sessions
  POST /backtest/compare        — compare two sessions
  DELETE /backtest/{id}         — delete session
  POST /backtest/run            — legacy single-shot endpoint
=========================================
"""
from __future__ import annotations

from fastapi import APIRouter, HTTPException

from app.backtest.backtest_engine import backtest_manager, BacktestState
from app.backtest.backtest_models import (
    BacktestRunRequest,
    BacktestControlRequest,
    BacktestSpeedRequest,
    BacktestCompareRequest,
    BacktestRequest,           # legacy
    BacktestResponse,          # legacy
)

router = APIRouter(prefix="/backtest", tags=["Backtest"])


# ── Start ─────────────────────────────────────────────────────────────────────

@router.post("/start", summary="Start a new backtest session")
def start_backtest(req: BacktestRunRequest):
    """
    Start a Professional Market Replay & Validation backtest.
    Modes: QUICK | PORTFOLIO | REPLAY | PAPER_REPLAY
    """
    # Normalize legacy fields
    data = req.model_dump()
    if data.get("initial_capital") and not data.get("capital"):
        data["capital"] = data["initial_capital"]
    if data.get("start_date") and not data.get("from_date"):
        data["from_date"] = data["start_date"]
    if data.get("end_date") and not data.get("to_date"):
        data["to_date"] = data["end_date"]
    if data.get("risk_percent") and not data.get("risk_pct"):
        data["risk_pct"] = data["risk_percent"]
    if data.get("strategy") and not data.get("strategies"):
        data["strategies"] = [data["strategy"]]
    if data.get("replay_speed"):
        data["replay_speed"] = float(data["replay_speed"])

    return backtest_manager.start(data)


# ── Control ───────────────────────────────────────────────────────────────────

@router.post("/pause", summary="Pause a running backtest")
def pause_backtest(req: BacktestControlRequest):
    try:
        return backtest_manager.pause(req.session_id)
    except KeyError as e:
        raise HTTPException(404, str(e))


@router.post("/resume", summary="Resume a paused backtest")
def resume_backtest(req: BacktestControlRequest):
    try:
        return backtest_manager.resume(req.session_id)
    except KeyError as e:
        raise HTTPException(404, str(e))


@router.post("/stop", summary="Stop and cancel a backtest session")
def stop_backtest(req: BacktestControlRequest):
    try:
        return backtest_manager.stop(req.session_id)
    except KeyError as e:
        raise HTTPException(404, str(e))


@router.post("/speed", summary="Set replay speed (candles/sec)")
def set_speed(req: BacktestSpeedRequest):
    try:
        return backtest_manager.set_speed(req.session_id, req.speed)
    except KeyError as e:
        raise HTTPException(404, str(e))


# ── Status ────────────────────────────────────────────────────────────────────

@router.get("/status/{session_id}", summary="Get session status and progress")
def get_status(session_id: str):
    try:
        return backtest_manager.status(session_id)
    except KeyError as e:
        raise HTTPException(404, str(e))


@router.get("/sessions", summary="List all backtest sessions")
def list_sessions():
    return backtest_manager.list_sessions()


# ── Replay navigation ─────────────────────────────────────────────────────────

@router.get("/next/{session_id}", summary="Advance one candle in replay mode")
def next_candle(session_id: str):
    try:
        return backtest_manager.next_candle(session_id)
    except KeyError as e:
        raise HTTPException(404, str(e))


@router.get("/prev/{session_id}", summary="Go back one candle in replay mode")
def prev_candle(session_id: str):
    try:
        return backtest_manager.prev_candle(session_id)
    except KeyError as e:
        raise HTTPException(404, str(e))


@router.get("/state/{session_id}", summary="Get current replay state (candle, positions, P&L)")
def get_state(session_id: str):
    try:
        return backtest_manager.current_state(session_id)
    except KeyError as e:
        raise HTTPException(404, str(e))


# ── Results ───────────────────────────────────────────────────────────────────

@router.get("/report/{session_id}", summary="Full analytics report (Sharpe, DD, PF, etc.)")
def get_report(session_id: str):
    try:
        return backtest_manager.get_report(session_id)
    except KeyError as e:
        raise HTTPException(404, str(e))


@router.get("/journal/{session_id}", summary="Trade journal — every trade with full details")
def get_journal(session_id: str, limit: int = 200):
    try:
        return backtest_manager.get_journal(session_id, limit)
    except KeyError as e:
        raise HTTPException(404, str(e))


# ── Comparison ────────────────────────────────────────────────────────────────

@router.post("/compare", summary="Compare two sessions (backtest vs paper vs live)")
def compare(req: BacktestCompareRequest):
    try:
        return backtest_manager.compare(req.session_id_a, req.session_id_b)
    except KeyError as e:
        raise HTTPException(404, str(e))


# ── Delete ────────────────────────────────────────────────────────────────────

@router.delete("/{session_id}", summary="Delete a session and free memory")
def delete_session(session_id: str):
    return backtest_manager.delete_session(session_id)


# ── Legacy endpoint (backward compatibility with existing frontend) ────────────

@router.post("/run", response_model=BacktestResponse, summary="[LEGACY] Run single-shot backtest")
def run_backtest_legacy(request: BacktestRequest):
    """
    Legacy endpoint — kept for backward compatibility.
    Converts old-style request to new engine and runs synchronously.
    For new integrations, use POST /backtest/start instead.
    """
    from app.backtest.backtest_manager import BacktestManager as _LegacyManager
    mgr = _LegacyManager()
    return mgr.run_backtest(request)
