"""LSEG credit bond analytics router."""
from fastapi import APIRouter, Depends, Request, HTTPException
from fastapi.responses import JSONResponse

from app.main import limiter
from app.dependencies import get_registry, run_sync
from app.services.registry import ServiceRegistry
from app.models.schemas import LsegBondOut, LsegBondListOut, LsegPortfolioSummaryOut

router = APIRouter()

_LOADING = JSONResponse({"status": "loading"}, status_code=202)


@router.get("/bonds")
@limiter.limit("30/minute")
async def list_bonds(
    request: Request,
    force_refresh: bool = False,
    registry: ServiceRegistry = Depends(get_registry),
):
    bonds = registry.lseg_bond_service.get_all_bonds(force_refresh)
    if bonds is None:
        return _LOADING
    return LsegBondListOut(bonds=bonds, count=len(bonds))


@router.get("/portfolio/summary")
@limiter.limit("30/minute")
async def portfolio_summary(
    request: Request,
    force_refresh: bool = False,
    registry: ServiceRegistry = Depends(get_registry),
):
    summary = registry.lseg_bond_service.get_portfolio_summary(force_refresh)
    if summary is None:
        return _LOADING
    return LsegPortfolioSummaryOut(**summary)


@router.get("/issuers/search")
@limiter.limit("60/minute")
async def search_issuers(
    request: Request,
    q: str = "",
    registry: ServiceRegistry = Depends(get_registry),
):
    q = q.strip()
    if len(q) < 2:
        return []
    client = registry.lseg_bond_service._get_api_client()
    return await run_sync(client.search_issuer_names, q)


@router.get("/bonds/{isin}", response_model=LsegBondOut)
@limiter.limit("30/minute")
async def get_bond(
    request: Request,
    isin: str,
    registry: ServiceRegistry = Depends(get_registry),
):
    bond = await run_sync(registry.lseg_bond_service.get_bond, isin)
    if bond is None:
        raise HTTPException(status_code=404, detail=f"Bond '{isin}' not found")
    return LsegBondOut(**bond)
