"""
=========================================
CV6 AI Trading OS
Dashboard Router
JSON-only. No frontend. No charts.
H-5 FIX: All endpoints now require JWT authentication via get_current_user.
=========================================
"""

from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session

from app.database.session import get_db
from app.dashboard.dashboard_schemas import (
    DashboardResponse, FundsInfo, PnLInfo, RiskInfo,
    AIStatusInfo, MarketStatusInfo, SystemHealthInfo,
)
from app.dashboard.dashboard_service import dashboard_service
from app.core.dependencies import get_current_user

router = APIRouter(
    prefix="/dashboard",
    tags=["Dashboard"],
)


@router.get(
    "/",
    response_model=DashboardResponse,
    summary="Full dashboard snapshot",
    description=(
        "Returns portfolio, funds, PnL, risk, open positions, orders, "
        "AI status, broker status, market status and system health — all in one call."
    ),
)
def full_dashboard(db: Session = Depends(get_db), _user=Depends(get_current_user)):
    try:
        return dashboard_service.snapshot(db)
    except Exception as e:
        raise HTTPException(500, str(e))


@router.get(
    "/portfolio",
    summary="All current positions across brokers",
)
def portfolio(db: Session = Depends(get_db), _user=Depends(get_current_user)):
    snap = dashboard_service.snapshot(db)
    return {"success": True, "portfolio": snap.portfolio}


@router.get(
    "/funds",
    response_model=FundsInfo,
    summary="Available cash, used margin, total funds",
)
def funds(db: Session = Depends(get_db), _user=Depends(get_current_user)):
    snap = dashboard_service.snapshot(db)
    return snap.funds or FundsInfo()


@router.get(
    "/pnl",
    response_model=PnLInfo,
    summary="Realized + unrealized PnL, net after charges, win rate",
)
def pnl(db: Session = Depends(get_db), _user=Depends(get_current_user)):
    snap = dashboard_service.snapshot(db)
    return snap.pnl or PnLInfo()


@router.get(
    "/risk",
    response_model=RiskInfo,
    summary="Margin utilization, exposure, daily loss status",
)
def risk(db: Session = Depends(get_db), _user=Depends(get_current_user)):
    snap = dashboard_service.snapshot(db)
    return snap.risk or RiskInfo()


@router.get(
    "/positions",
    summary="Open positions only (non-zero quantity)",
)
def open_positions(db: Session = Depends(get_db), _user=Depends(get_current_user)):
    snap = dashboard_service.snapshot(db)
    return {"success": True, "open_positions": snap.open_positions}


@router.get(
    "/orders",
    summary="Recent orders across all brokers",
)
def orders(db: Session = Depends(get_db), _user=Depends(get_current_user)):
    snap = dashboard_service.snapshot(db)
    return {"success": True, "orders": snap.orders}


@router.get(
    "/ai",
    response_model=AIStatusInfo,
    summary="AI consensus engine status and active models",
)
def ai_status(db: Session = Depends(get_db), _user=Depends(get_current_user)):
    snap = dashboard_service.snapshot(db)
    return snap.ai_status or AIStatusInfo()


@router.get(
    "/broker",
    summary="Connection status and latency for all brokers",
)
def broker_status(db: Session = Depends(get_db), _user=Depends(get_current_user)):
    snap = dashboard_service.snapshot(db)
    return {"success": True, "brokers": snap.broker_status}


@router.get(
    "/market",
    response_model=MarketStatusInfo,
    summary="Current market session — OPEN / PRE_OPEN / CLOSED",
)
def market_status(_user=Depends(get_current_user)):
    from app.dashboard.dashboard_service import dashboard_service as svc
    return svc._market_status()


@router.get(
    "/health",
    response_model=SystemHealthInfo,
    summary="CPU, memory, disk, uptime, WebSocket clients",
)
def system_health(_user=Depends(get_current_user)):
    from app.dashboard.dashboard_service import dashboard_service as svc
    return svc._health()
