"""Pydantic v2 response models for all API endpoints."""
from __future__ import annotations

from typing import Optional
from pydantic import BaseModel


# ── Bond risk sub-object ──────────────────────────────────────────────────────

class BondRiskOut(BaseModel):
    composite_score: float
    composite_grade: str
    rating_score: Optional[float] = None
    rating_grade: Optional[str] = None
    spread_score: float
    spread_used: str
    spread_bps: Optional[float] = None
    is_investment_grade: bool


# ── Single bond ───────────────────────────────────────────────────────────────

class LsegBondOut(BaseModel):
    isin: Optional[str] = None
    ric: Optional[str] = None
    name: Optional[str] = None
    issuer: Optional[str] = None
    coupon: Optional[float] = None
    maturity_date: Optional[str] = None
    issue_date: Optional[str] = None
    coupon_freq: Optional[float] = None
    coupon_type: Optional[str] = None
    rating_moodys: Optional[str] = None
    currency: Optional[str] = None
    price: Optional[float] = None
    ytm: Optional[float] = None
    ytw: Optional[float] = None
    z_spread: Optional[float] = None
    oas: Optional[float] = None
    asset_swap_spread: Optional[float] = None
    country: Optional[str] = None
    trbc_ig: Optional[str] = None
    trbc_industry: Optional[str] = None
    duration: Optional[float] = None
    risk: BondRiskOut


# ── Bond list ─────────────────────────────────────────────────────────────────

class LsegBondListOut(BaseModel):
    bonds: list[LsegBondOut]
    count: int


# ── Portfolio summary ─────────────────────────────────────────────────────────

class LsegPortfolioSummaryOut(BaseModel):
    total_bonds: int
    avg_composite_score: Optional[float] = None
    grade_distribution: dict[str, int]
    investment_grade_count: int
    high_yield_count: int
    avg_spread_bps: Optional[float] = None


# ── Peer curve ────────────────────────────────────────────────────────────────

class PeerCurveUniverseOAS(BaseModel):
    """Average OAS (bps) for one maturity bucket across each peer universe."""
    issuer: Optional[float] = None
    rating_peers: Optional[float] = None
    sector: Optional[float] = None
    sub_sector: Optional[float] = None
    rating_sector: Optional[float] = None
    rating_sub_sector: Optional[float] = None
    lower_rating_sub_sector: Optional[float] = None
    upper_rating_sub_sector: Optional[float] = None


class PeerCurveResponse(BaseModel):
    issuer: str
    sector: Optional[str] = None
    sub_sector: Optional[str] = None
    sector_label: str = "Sector"
    sub_sector_label: str = "Industry Group"
    rating_bucket: Optional[str] = None
    rating_peer_buckets: list[str] = []
    lower_rating_bucket: Optional[str] = None
    upper_rating_bucket: Optional[str] = None
    table: dict[str, PeerCurveUniverseOAS]  # key = maturity bucket label
    bond_counts: dict[str, int]
    chart_data: list[dict]                  # recharts-compatible row per bucket
    spread_source: str = "z_spread"
