from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session

from app.db import get_db
from app.models.schemas import SuggestedRoute, TripResult, TripStop
from app.services import trip as trip_service

router = APIRouter(prefix="/api/trip", tags=["trip"])


@router.get("/featured", response_model=TripResult)
def featured(limit: int = Query(default=6, ge=1, le=24), db: Session = Depends(get_db)) -> TripResult:
    codes = trip_service.best_route(db)
    return trip_service.compare_trip(db, codes, limit=limit)


@router.get("/suggested", response_model=list[SuggestedRoute])
def suggested(db: Session = Depends(get_db)) -> list[SuggestedRoute]:
    stops = {s.code: s for s in trip_service.available_stops(db)}
    out: list[SuggestedRoute] = []
    for codes in trip_service.suggested_routes(db):
        result = trip_service.compare_trip(db, codes, limit=1)
        out.append(
            SuggestedRoute(
                codes=codes,
                labels=[(stops[c].name if c in stops else c) for c in codes],
                compared=result.compared,
            )
        )
    return out


@router.get("/stops", response_model=list[TripStop])
def stops(db: Session = Depends(get_db)) -> list[TripStop]:
    return trip_service.available_stops(db)


@router.get("", response_model=TripResult)
def compare(
    codes: list[str] = Query(default=[], alias="code", max_length=12),
    category: str | None = Query(default=None, max_length=80),
    awarded_only: bool = False,
    exclusives_only: bool = False,
    q: str | None = Query(default=None, max_length=120),
    min_saving: float = Query(default=0.0, ge=0),
    sort: str = Query(default="saving", pattern="^(saving|percent|cheapest|dearest|name)$"),
    limit: int = Query(default=60, ge=1, le=200),
    db: Session = Depends(get_db),
) -> TripResult:
    return trip_service.compare_trip(
        db,
        codes,
        category=category,
        awarded_only=awarded_only,
        exclusives_only=exclusives_only,
        q=q,
        min_saving=min_saving,
        sort=sort,
        limit=limit,
    )
