"""Risk Management API Endpoints."""
from __future__ import annotations

from typing import Any

from fastapi import APIRouter

from backend.app.config.settings import settings
from backend.app.database.session import db_manager
from backend.app.portfolio.manager import portfolio_manager
from backend.app.risk.circuit_breakers import circuit_breakers
from backend.app.risk.kill_switch import kill_switch

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


@router.get("/status")
async def get_risk_status() -> dict[str, Any]:
    """Retrieve active risk guardrails, daily loss utilization, and circuit breaker status."""
    account = portfolio_manager.get_account_state()
    cb_status = circuit_breakers.check_portfolio_limits(account)
    ks_details = kill_switch.get_details()

    daily_loss_pct = (
        float(-account.unrealized_daily_pnl / account.starting_day_equity) * 100.0
        if account.starting_day_equity > 0
        else 0.0
    )
    drawdown_pct = (
        float((account.peak_equity - account.equity) / account.peak_equity) * 100.0
        if account.peak_equity > 0
        else 0.0
    )

    return {
        "kill_switch": ks_details,
        "circuit_breaker": {
            "tripped": cb_status.tripped,
            "reason": cb_status.reason,
        },
        "limits": {
            "risk_per_trade_pct": settings.RISK_PER_TRADE_PCT * 100.0,
            "max_positions": settings.MAX_POSITIONS,
            "max_daily_loss_pct": settings.MAX_DAILY_LOSS_PCT * 100.0,
            "max_drawdown_pct": settings.MAX_DRAWDOWN_PCT * 100.0,
            "max_leverage": settings.MAX_LEVERAGE,
            "min_reward_to_risk": settings.MIN_REWARD_TO_RISK,
            "small_account_protection": settings.SMALL_ACCOUNT_PROTECTION,
        },
        "portfolio": {
            "equity": float(account.equity),
            "peak_equity": float(account.peak_equity),
            "starting_day_equity": float(account.starting_day_equity),
            "open_positions_count": account.open_positions_count,
            "current_daily_loss_pct": round(daily_loss_pct, 2),
            "current_drawdown_pct": round(drawdown_pct, 2),
        },
    }


@router.get("/decisions")
async def get_risk_decisions() -> list[dict[str, Any]]:
    """Retrieve audit history of pre-trade risk evaluations."""
    return db_manager.execute_read_all(
        "SELECT * FROM risk_decisions ORDER BY timestamp DESC LIMIT 50"
    )
