from __future__ import annotations

from fastapi import APIRouter, Depends
from fastapi import Body
from fastapi import Query

from app.db import database
from app.v1.dependencies.auth import get_current_userdetails
from app.v1.services.alerts import (
    get_materialized_top_signals_for_user,
    get_top_signals_service,
    get_user_alert_settings,
    update_user_alert_settings,
)


router = APIRouter()


@router.get("/alerts", summary="Alerts & Signals (Top Signals only, DB-only)")
async def get_alerts_top_signals(
    limit: int = Query(10, ge=1, le=50, description="Max top signals to return"),
    db=Depends(database.get_mongo_db),
    current_user=Depends(get_current_userdetails),
):
    """Return Top Signals only.

    IMPORTANT:
    - DB-only (no Zerodha, no GPT)
    - Universe:
      - Normal user: portfolio only
      - Super admin (role==1): portfolio + ET movers

    Response shape matches existing Alerts page expectations.
    """

    # Prefer the materialized list produced by background GlobalIntraday.
    # If that list is empty (e.g. background not running yet), fall back to legacy
    # snapshot scan to keep backward compatibility.
    top = get_materialized_top_signals_for_user(db, current_user=current_user, limit=limit)
    if int((top.get("counts") or {}).get("top_signals") or 0) == 0:
        top = get_top_signals_service(db, current_user=current_user, limit=limit)

    # Keep backward-compatible structure for the existing Alerts UI tabs.
    return {
        "status": "ok",
        "source": top.get("source"),
        "counts": {
            "top_signals": (top.get("counts") or {}).get("top_signals", 0),
            "monitoring": 0,
            "triggered": 0,
            "closed": 0,
        },
        "data": {
            "top_signals": top.get("top_signals") or [],
            "monitoring": [],
            "triggered": [],
            "closed": [],
        },
    }


@router.get("/alerts/top-signals", summary="Top Signals only (DB-only)")
async def get_top_signals(
    limit: int = Query(10, ge=1, le=50, description="Max top signals to return"),
    db=Depends(database.get_mongo_db),
    current_user=Depends(get_current_userdetails),
):
    top = get_materialized_top_signals_for_user(db, current_user=current_user, limit=limit)
    if int((top.get("counts") or {}).get("top_signals") or 0) == 0:
        top = get_top_signals_service(db, current_user=current_user, limit=limit)
    return top


@router.get("/alerts/settings", summary="Get current user's alert settings")
async def get_alert_settings(
    db=Depends(database.get_mongo_db),
    current_user=Depends(get_current_userdetails),
):
    user_id = str((current_user or {}).get("_id"))
    return {"status": "ok", "settings": get_user_alert_settings(db, user_id=user_id)}


@router.put("/alerts/settings", summary="Update current user's alert settings")
async def put_alert_settings(
    payload: dict = Body(...),
    db=Depends(database.get_mongo_db),
    current_user=Depends(get_current_userdetails),
):
    user_id = str((current_user or {}).get("_id"))
    settings = payload.get("settings") if isinstance(payload, dict) else None
    updated = update_user_alert_settings(db, user_id=user_id, settings=settings if isinstance(settings, dict) else {})
    return {"status": "ok", "settings": updated}
