"""
=========================================
CV6 Risk Guard — FastAPI Router
/risk/* endpoints
=========================================
"""

from fastapi import APIRouter, Depends
from pydantic import BaseModel
from typing import Any, Dict, List, Optional

from app.risk_guard.risk_guard import risk_guard
from app.core.dependencies import get_current_user

router = APIRouter(prefix="/risk", tags=["Risk Guard"])


# ── Schemas ────────────────────────────────────────────────────────────────────

class KillSwitchIn(BaseModel):
    active: bool
    reason: Optional[str] = "Manual"


class ConfigUpdateIn(BaseModel):
    daily_loss_limit:     Optional[float] = None
    weekly_loss_limit:    Optional[float] = None
    monthly_loss_limit:   Optional[float] = None
    max_drawdown_pct:     Optional[float] = None
    max_sector_pct:       Optional[float] = None
    max_same_sector:      Optional[int]   = None
    vix_block_threshold:  Optional[float] = None
    news_filter_active:   Optional[bool]  = None
    circuit_filter_pct:   Optional[float] = None
    enforce_market_hours: Optional[bool]  = None
    market_holidays:      Optional[List[str]] = None


class CheckEntryIn(BaseModel):
    symbol:          str
    sector:          str
    ltp:             float
    change_pct:      float
    vix:             float = 0.0
    news_sentiment:  str   = "NEUTRAL"
    open_positions:  List[dict] = []
    capital:         float = 0.0
    deployed:        float = 0.0
    mode:            str   = "PAPER"


# ── Routes ─────────────────────────────────────────────────────────────────────

@router.get("/status")
def get_status(_user=Depends(get_current_user)) -> dict:
    """Current risk guard status + P&L drawdown."""
    return risk_guard.get_status()


@router.get("/config")
def get_config(_user=Depends(get_current_user)) -> dict:
    """All risk configuration settings."""
    return risk_guard.get_config_dict()


@router.post("/config")
def update_config(body: ConfigUpdateIn, _user=Depends(get_current_user)) -> dict:
    """Update one or more risk config fields at runtime."""
    updates = {k: v for k, v in body.dict().items() if v is not None}
    risk_guard.update_config(updates)
    return {"ok": True, "updated": list(updates.keys())}


@router.post("/kill-switch")
def set_kill_switch(body: KillSwitchIn, _user=Depends(get_current_user)) -> dict:
    """Activate or deactivate the emergency kill switch."""
    if body.active:
        risk_guard.activate_kill_switch(body.reason or "Manual")
    else:
        risk_guard.deactivate_kill_switch()
    return {"ok": True, "kill_switch": body.active}


@router.post("/check")
def check_entry(body: CheckEntryIn, _user=Depends(get_current_user)) -> dict:
    """
    Run all risk checks for a proposed new entry.
    Returns {allowed: bool, reason: str, layer: str}.
    """
    verdict = risk_guard.check_entry(
        symbol         = body.symbol,
        sector         = body.sector,
        ltp            = body.ltp,
        change_pct     = body.change_pct,
        vix            = body.vix,
        news_sentiment = body.news_sentiment,
        open_positions = body.open_positions,
        capital        = body.capital,
        deployed       = body.deployed,
        mode           = body.mode,
    )
    return verdict.to_dict()


@router.get("/pnl")
def get_pnl(_user=Depends(get_current_user)) -> dict:
    """Today / week / month realised P&L."""
    return risk_guard.loss.summary()


@router.get("/drawdown")
def get_drawdown(_user=Depends(get_current_user)) -> dict:
    """Current drawdown from equity peak."""
    return {
        "drawdown_pct": risk_guard.drawdown.drawdown_pct,
        "limit_pct":    risk_guard.config.max_drawdown_pct,
        "breached":     risk_guard.drawdown.drawdown_pct >= risk_guard.config.max_drawdown_pct,
    }
