from fastapi import APIRouter, Depends, HTTPException, Query import logging from typing import Optional from ..db_engine import model_to_dict from ..dependencies import oauth2_scheme, valid_token router = APIRouter(prefix="/api/v2/evolution", tags=["evolution"]) @router.get("/tracks") async def list_tracks( card_type: Optional[str] = Query(default=None), token: str = Depends(oauth2_scheme), ): if not valid_token(token): logging.warning("Bad Token: [REDACTED]") raise HTTPException(status_code=401, detail="Unauthorized") from ..db_engine import EvolutionTrack query = EvolutionTrack.select() if card_type is not None: query = query.where(EvolutionTrack.card_type == card_type) items = [model_to_dict(t, recurse=False) for t in query] return {"count": len(items), "items": items} @router.get("/tracks/{track_id}") async def get_track(track_id: int, token: str = Depends(oauth2_scheme)): if not valid_token(token): logging.warning("Bad Token: [REDACTED]") raise HTTPException(status_code=401, detail="Unauthorized") from ..db_engine import EvolutionTrack try: track = EvolutionTrack.get_by_id(track_id) except Exception: raise HTTPException(status_code=404, detail=f"Track {track_id} not found") return model_to_dict(track, recurse=False) @router.post("/cards/{card_id}/evaluate") async def evaluate_card(card_id: int, token: str = Depends(oauth2_scheme)): """Force-recalculate evolution state for a card from career stats. Resolves card_id to (player_id, team_id), then recomputes the evolution tier from all player_season_stats rows for that pair. Idempotent. """ if not valid_token(token): logging.warning("Bad Token: [REDACTED]") raise HTTPException(status_code=401, detail="Unauthorized") from ..db_engine import Card from ..services.evolution_evaluator import evaluate_card as _evaluate try: card = Card.get_by_id(card_id) except Exception: raise HTTPException(status_code=404, detail=f"Card {card_id} not found") try: result = _evaluate(card.player_id, card.team_id) except ValueError as exc: raise HTTPException(status_code=404, detail=str(exc)) return result