"""Credit Peer Curve router — OAS term structure across peer universes."""
from typing import List
from fastapi import APIRouter, Depends, HTTPException, Query, Request
from fastapi.responses import JSONResponse

from app.main import limiter
from app.dependencies import get_registry
from app.services.registry import ServiceRegistry
from app.models.schemas import PeerCurveResponse, PeerCurveUniverseOAS

router = APIRouter()


@router.get("/peer-curve")
@limiter.limit("10/minute")
async def peer_curve(
    request: Request,
    issuer: List[str] = Query(...),
    registry: ServiceRegistry = Depends(get_registry),
):
    issuers = [i.strip() for i in issuer if i.strip()]
    if not issuers:
        raise HTTPException(status_code=422, detail="At least one issuer is required")
    display_name = issuers[0] if len(issuers) == 1 else f"{issuers[0]} + {len(issuers) - 1} more"
    result = registry.peer_curve_service.build(issuers, display_name)
    if result is None:
        return JSONResponse({"status": "loading"}, status_code=202)
    if "__error__" in result:
        raise HTTPException(status_code=404, detail=result["__error__"])

    table = {
        bucket: PeerCurveUniverseOAS(**row)
        for bucket, row in result["table"].items()
    }

    return PeerCurveResponse(
        issuer=result["issuer"],
        sector=result.get("sector"),
        sub_sector=result.get("sub_sector"),
        sector_label=result.get("sector_label", "Sector"),
        sub_sector_label=result.get("sub_sector_label", "Industry Group"),
        rating_bucket=result.get("rating_bucket"),
        rating_peer_buckets=result.get("rating_peer_buckets", []),
        lower_rating_bucket=result.get("lower_rating_bucket"),
        upper_rating_bucket=result.get("upper_rating_bucket"),
        table=table,
        bond_counts=result["bond_counts"],
        chart_data=result["chart_data"],
        spread_source=result.get("spread_source", "z_spread"),
    )
