from fastapi import APIRouter, Depends, HTTPException from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import joinedload from app.core.database import get_session from app.models.pokemon import Pokemon from app.models.route import Route from app.models.route_encounter import RouteEncounter from app.schemas.pokemon import PokemonResponse, RouteEncounterDetailResponse router = APIRouter() @router.get("/pokemon/{pokemon_id}", response_model=PokemonResponse) async def get_pokemon( pokemon_id: int, session: AsyncSession = Depends(get_session) ): pokemon = await session.get(Pokemon, pokemon_id) if pokemon is None: raise HTTPException(status_code=404, detail="Pokemon not found") return pokemon @router.get( "/routes/{route_id}/pokemon", response_model=list[RouteEncounterDetailResponse], ) async def list_route_encounters( route_id: int, session: AsyncSession = Depends(get_session) ): # Verify route exists route = await session.get(Route, route_id) if route is None: raise HTTPException(status_code=404, detail="Route not found") result = await session.execute( select(RouteEncounter) .where(RouteEncounter.route_id == route_id) .options(joinedload(RouteEncounter.pokemon)) .order_by(RouteEncounter.encounter_rate.desc()) ) return result.scalars().unique().all()