from typing import Literal

from fastapi import APIRouter, Depends
from pydantic import BaseModel, Field
from common_logging import get_logger

from app.api.permissions import get_current_user
from app.models.user import User
from app.services.monitoring.gpu_runtime_service import (
    GpuRuntimeMonitoringService,
    get_gpu_runtime_service,
)

logger = get_logger(__name__)
router = APIRouter()


class GpuOverviewResponse(BaseModel):
    totalGpuCount: int = Field(..., description="Total detected GPUs")
    onlineGpuCount: int = Field(..., description="Online GPU count")
    runningModelCount: int = Field(..., description="Running model count")
    alertCount: int = Field(..., description="Alert count")
    updatedAt: str = Field(..., description="Snapshot timestamp")


class GpuDeviceStatusResponse(BaseModel):
    id: str
    name: str
    hostName: str
    status: Literal["online", "busy", "warning", "offline"]
    memoryUsedGb: float
    memoryTotalGb: float
    memoryUsagePercent: int
    utilizationPercent: int
    runningModelNames: list[str]


class RunningModelResponse(BaseModel):
    id: str
    name: str
    version: str
    status: Literal["running", "loading", "idle", "failed"]
    gpuId: str
    gpuName: str
    memoryUsedGb: float
    startedAt: str


class GpuSnapshotResponse(BaseModel):
    overview: GpuOverviewResponse
    devices: list[GpuDeviceStatusResponse]
    models: list[RunningModelResponse]


@router.get("/snapshot", response_model=GpuSnapshotResponse, summary="获取 GPU 监控快照")
def get_gpu_snapshot(
    current_user: User = Depends(get_current_user),
    gpu_service: GpuRuntimeMonitoringService = Depends(get_gpu_runtime_service),
):
    logger.info(f"Fetching GPU snapshot: user={current_user.id}")
    del current_user
    return gpu_service.get_snapshot()


@router.get("/overview", response_model=GpuOverviewResponse, summary="获取 GPU 监控总览")
def get_gpu_overview(
    current_user: User = Depends(get_current_user),
    gpu_service: GpuRuntimeMonitoringService = Depends(get_gpu_runtime_service),
):
    del current_user
    return gpu_service.get_snapshot()["overview"]


@router.get("/devices", response_model=list[GpuDeviceStatusResponse], summary="获取 GPU 设备状态")
def get_gpu_devices(
    current_user: User = Depends(get_current_user),
    gpu_service: GpuRuntimeMonitoringService = Depends(get_gpu_runtime_service),
):
    del current_user
    return gpu_service.get_snapshot()["devices"]


@router.get("/models", response_model=list[RunningModelResponse], summary="获取运行中的模型")
def get_gpu_models(
    current_user: User = Depends(get_current_user),
    gpu_service: GpuRuntimeMonitoringService = Depends(get_gpu_runtime_service),
):
    del current_user
    return gpu_service.get_snapshot()["models"]
