from fastapi import APIRouter, Depends
from pydantic import BaseModel, Field
from sqlalchemy.orm import Session

from ..database import get_db
from ..services.backtest import run_backtest
from ..services.learning import get_calibration

router = APIRouter(tags=["analytics"])


class BacktestRequest(BaseModel):
    symbols: list[str] | None = None
    days: int = Field(180, ge=90, le=730)
    min_score: float = Field(60.0, ge=30, le=95)
    horizon: int = Field(10, ge=3, le=30)
    slippage_bps: float = Field(5.0, ge=0, le=100)
    commission_per_share: float = Field(0.005, ge=0, le=1)


@router.post("/api/backtest/run")
def backtest(body: BacktestRequest):
    """Walk-forward strategy backtest with cost modeling. Research only."""
    return run_backtest(symbols=body.symbols, days=body.days,
                        min_score=body.min_score, horizon=body.horizon,
                        slippage_bps=body.slippage_bps,
                        commission_per_share=body.commission_per_share)


@router.get("/api/analytics/regime")
def market_regime():
    """Current market regime classification from the index proxy."""
    from ..agents.regime import REGIME_SYMBOL, RegimeAgent
    from ..services.market_data import get_provider

    result = RegimeAgent().run({"history": get_provider().get_history(REGIME_SYMBOL, 90)})
    return {**result.data, "notes": result.notes, "symbol": REGIME_SYMBOL}


@router.get("/api/learning/calibration")
def calibration(db: Session = Depends(get_db)):
    """Predicted-vs-actual probability calibration from closed paper trades."""
    return get_calibration(db)


@router.get("/api/analytics/performance")
def performance(db: Session = Depends(get_db)):
    """Scorekeeper + report card: per-strategy performance with grades."""
    from ..services.performance import strategy_performance

    return strategy_performance(db)


@router.get("/api/analytics/benchmark")
def benchmark_endpoint(days: int = 30, db: Session = Depends(get_db)):
    """Benchmark agent: realized performance vs SPY."""
    from ..services.performance import benchmark

    return benchmark(db, days=max(7, min(365, days)))
