from typing import Annotated, Optional

from asyncreq import request
from fastapi import APIRouter, Header, HTTPException, Request, Response

from src.api.config import API_FLIGHTS
from src.api.routes.auth import checkAuth
from src.api.schemas.flight import Flight, FlightCreate, FlightFull, FlightUpdate

router = APIRouter()


@router.get("/{id}", response_model=FlightFull)
async def get_flight_by_id(
    id: int,
    req: Request,
):
    request_id = req.state.request_id
    header = {"x-api-request-id": request_id}
    (response, status, _) = await request(f"{API_FLIGHTS}/{id}", "GET", headers=header)
    if status < 200 or status > 204:
        raise HTTPException(status_code=status, detail=response)
    return response


@router.post("", response_model=Flight)
async def create_flight(
    flight: FlightCreate,
    req: Request,
    authorization: Annotated[str | None, Header()] = None,
):
    authData = await checkAuth(req, authorization, roles=["airline"])
    flight_data = flight.model_dump()
    flight_data["user_id"] = authData["id"]
    request_id = req.state.request_id
    header = {"x-api-request-id": request_id}
    (response, status, _) = await request(
        f"{API_FLIGHTS}", "POST", json=flight_data, headers=header
    )
    if status < 200 or status > 204:
        raise HTTPException(status_code=status, detail=response)
    return response


@router.patch("/{id}", response_model=Flight)
async def update_flight(
    id: int,
    flight_update: FlightUpdate,
    req: Request,
    authorization: Annotated[str | None, Header()] = None,
):
    authData = await checkAuth(req, authorization, roles=["airline", "admin"])
    update = flight_update.model_dump()
    update["user_id"] = authData["id"]
    request_id = req.state.request_id
    header = {"x-api-request-id": request_id}
    (response, status, _) = await request(
        f"{API_FLIGHTS}/{id}", "PATCH", json=update, headers=header
    )
    if status < 200 or status > 204:
        raise HTTPException(status_code=status, detail=response)
    return response


@router.get("", response_model=list[FlightFull])
async def get_flights(
    req: Request,
    res: Response,
    origin: Optional[str] = None,
    destination: Optional[str] = None,
    lastUpdated: Optional[str] = None,
    page: Optional[int] = 1,
    future: Optional[str] = None,
):
    query = {}
    if origin:
        query["origin"] = origin
    if destination:
        query["destination"] = destination
    if lastUpdated:
        query["lastUpdated"] = lastUpdated
    if future:
        query["future"] = future
    if page:
        query["page"] = page
    request_id = req.state.request_id
    header = {"x-api-request-id": request_id}
    (response, status, headers) = await request(
        f"{API_FLIGHTS}", "GET", query=query, headers=header
    )
    if status < 200 or status > 204:
        raise HTTPException(status_code=status, detail=response)
    if "x-count" in headers:
        res.headers["x-count"] = headers["x-count"]
    return response