from fastapi import (
    FastAPI,
    APIRouter,
    Query,
    Path,
    Body,
    Cookie,
    Header,
    File,
    Form,
    Depends,
    Security,
)
from pydantic import BaseModel

app = FastAPI()
router = APIRouter()


# Fixable errors

@app.get("/items/")
def get_items(
    current_user: User = Depends(get_current_user),
    some_security_param: str = Security(get_oauth2_user),
):
    pass


@app.post("/stuff/")
def do_stuff(
    some_query_param: str | None = Query(default=None),
    some_path_param: str = Path(),
    some_body_param: str = Body("foo"),
    some_cookie_param: str = Cookie(),
    some_header_param: int = Header(default=5),
    some_file_param: UploadFile = File(),
    some_form_param: str = Form(),
):
    # do stuff
    pass

@app.get("/users/")
def get_users(
    skip: int,
    limit: int,
    current_user: User = Depends(get_current_user),
):
    pass

@app.get("/users/")
def get_users(
    current_user: User = Depends(get_current_user),
    skip: int = 0,
    limit: int = 10,
):
    pass


@app.get("/items/{item_id}")
async def read_items(*, item_id: int = Path(title="The ID of the item to get"), q: str):
    pass

# Non fixable errors

@app.get("/users/")
def get_users(
    skip: int = 0,
    limit: int = 10,
    current_user: User = Depends(get_current_user),
):
    pass


# Unchanged


@app.post("/stuff/")
def do_stuff(
    no_default: Body("foo"),
    no_type_annotation=str,
    no_fastapi_default: str = BaseModel(),
):
    pass


# OK

@app.post("/stuff/")
def do_stuff(
    some_path_param: Annotated[str, Path()],
    some_cookie_param: Annotated[str, Cookie()],
    some_file_param: Annotated[UploadFile, File()],
    some_form_param: Annotated[str, Form()],
    some_query_param: Annotated[str | None, Query()] = None,
    some_body_param: Annotated[str, Body()] = "foo",
    some_header_param: Annotated[int, Header()] = 5,
):
    pass
