"""POST /api/rows — filter + sort the MV database, return compact table rows.""" import math from typing import List, Optional import pandas as pd from fastapi import APIRouter from pydantic import BaseModel from data import get_rows router = APIRouter() class RowsRequest(BaseModel): seasons: Optional[List[str]] = None leagues: Optional[List[str]] = None positions: Optional[List[str]] = None age_min: Optional[int] = None age_max: Optional[int] = None min_minutes: int = 0 foot: Optional[str] = None mv_min_millions: Optional[float] = None mv_max_millions: Optional[float] = None nationality: Optional[str] = None conf: Optional[str] = None sort: str = 'mv_eos' sort_dir: str = 'desc' limit: int = 2000 def _s(v): if v is None or (isinstance(v, float) and (math.isnan(v) or pd.isna(v))): return None return v @router.post('/rows') def rows(req: RowsRequest): df = get_rows(seasons=req.seasons, leagues=req.leagues, positions=req.positions, age_min=req.age_min, age_max=req.age_max, min_minutes=req.min_minutes, foot=req.foot, mv_min_millions=req.mv_min_millions, mv_max_millions=req.mv_max_millions, nationality=req.nationality, conf=req.conf, sort=req.sort, sort_dir=req.sort_dir, limit=req.limit) out = [] for d in df.to_dict('records'): out.append({ 'pid': str(d['playerId']), 'tm_id': _s(d['tm_id']), 'j': _s(d['Jugador']), 'p': _s(d['Posicion']), 't': _s(d['Temporada']), 'age': _s(d['age']), 'nat': _s(d['nationality']), 'e': _s(d['Equipo']), 'c': _s(d['Competencia']), 'min': _s(d['Minutos totales']), 'mv': _s(d['mv_eos']), 'mv_prev': _s(d['mv_eos_prev']), 'mv_now': _s(d['tm_mv_now']), 'src': _s(d['mv_source']), 'conf': _s(d['match_conf']), 'url': _s(d['tm_url']), 'ct': _s(d['tm_contract_until']), 'foot': _s(d['tm_foot']), }) return {'rows': out, 'count': len(out)}