"""Jellyseerr request stats — powers the Requests tab on the Jellyfin page.

Jellyseerr is an optional companion of the Jellyfin service. This router
resolves the Jellyfin service instance (by ``jellyfin_service_id`` or the first
enabled one) and delegates to the registered Jellyseerr stats provider, which
shares its short-TTL cache with the ``stat`` / ``stats_overview`` widgets so
the tab and the widgets don't each hit Jellyseerr.
"""

from __future__ import annotations

import logging

from fastapi import APIRouter, Depends, HTTPException

from media_library_viewer_api.dependencies import get_settings_store
from media_library_viewer_api.services.service_resolution import resolve_service_record
from media_library_viewer_api.services.settings_store import SettingsStore
from media_library_viewer_api.widgets import jellyseerr_stats  # noqa: F401 — ensure provider registration
from media_library_viewer_api.widgets.jellyseerr_stats import fetch_jellyseer_requests
from media_library_viewer_api.widgets.stats_provider import get_stats_provider

logger = logging.getLogger(__name__)

router = APIRouter(prefix="/api/jellyseerr", tags=["jellyseerr"])


def _serialize(result) -> dict:
    return {
        "stats": [{"key": s.key, "label": s.label, "value": s.value} for s in result.stats],
        "recent": result.recent,
        "detail": result.detail,
    }


@router.get("/stats")
def get_jellyseerr_stats(
    jellyfin_service_id: str | None = None,
    store: SettingsStore = Depends(get_settings_store),
) -> dict:
    """Return Jellyseerr request counts + a recent-requests list."""
    service = resolve_service_record(store, "jellyfin", jellyfin_service_id)
    if service is None:
        raise HTTPException(status_code=503, detail="No Jellyfin service is configured.")
    provider = get_stats_provider("jellyfin")
    if provider is None:  # pragma: no cover - registered at import
        raise HTTPException(status_code=503, detail="Jellyseerr stats provider is not available.")
    try:
        result = provider.fetch_stats(service)
    except Exception as exc:  # pragma: no cover - provider guards internally
        logger.exception("Jellyseerr stats endpoint failed")
        raise HTTPException(status_code=502, detail=f"Jellyseerr fetch failed: {exc}") from exc
    return _serialize(result)


@router.get("/requests")
def get_jellyseerr_requests(
    jellyfin_service_id: str | None = None,
    store: SettingsStore = Depends(get_settings_store),
) -> dict:
    """Return Jellyseerr requests for the Requests tab table (filter/sort client-side)."""
    service = resolve_service_record(store, "jellyfin", jellyfin_service_id)
    if service is None:
        raise HTTPException(status_code=503, detail="No Jellyfin service is configured.")
    try:
        requests = fetch_jellyseer_requests(service)
    except Exception as exc:  # pragma: no cover - client guards internally
        logger.exception("Jellyseerr requests endpoint failed")
        raise HTTPException(status_code=502, detail=f"Jellyseerr fetch failed: {exc}") from exc
    return {"requests": requests}
