# Generated by oapi-gen 0.1.0. DO NOT EDIT.
# Source SHA256: 7b3381eb8339af725253f04fe07b232aa9922b9cd9a5216c51fec7c10670ab71
from __future__ import annotations

from pathlib import Path
from typing import Annotated
from uuid import UUID

from msgspec import Meta, convert, json, to_builtins
from starlette.requests import Request
from starlette.responses import Response
from starlette.routing import Route, Router

from . import _runtime
from . import contracts as _contracts
from . import models as _models
from .contracts import (
    Handlers,
)

_encoder = json.Encoder()
_list_cats_parameter_0 = Annotated[int, Meta(ge=1, le=100)] | None
json.Decoder(_list_cats_parameter_0)
_list_cats_200_decoder = json.Decoder(list[_models.Cat])
_list_cats_404_decoder = json.Decoder(_models.HttpError)
_create_cat_body_decoder = json.Decoder(_models.CatCreate)
_show_cat_by_id_parameter_0 = UUID
json.Decoder(_show_cat_by_id_parameter_0)
_show_cat_by_id_200_decoder = json.Decoder(_models.Cat)
_show_cat_by_id_404_decoder = json.Decoder(_models.HttpError)


def create_router(handlers: Handlers, *, prefix: str = "", include_schema: bool = True) -> Router:
    __oapi_handlers = handlers

    async def __oapi_endpoint_list_cats(__oapi_http: Request) -> Response:
        try:
            __oapi_parameter_0 = _runtime.parameter(
                __oapi_http.query_params.get("limit"),
                _list_cats_parameter_0,
                ("query", "limit"),
                required=False,
                default=None,
            )
        except _runtime.RequestError as __oapi_error:
            return _runtime.error_response(__oapi_error)
        __oapi_request = _contracts.ListCats.Request(limit=__oapi_parameter_0)
        try:
            __oapi_result = await __oapi_handlers.cats.list_cats(__oapi_request)
        except _contracts.ListCats.NotFound as __oapi_error:
            __oapi_result = __oapi_error
        else:
            if isinstance(__oapi_result, Exception):
                raise TypeError("listCats error responses must be raised")
        if isinstance(__oapi_result, _contracts.ListCats.Ok):
            __oapi_body = convert(to_builtins(__oapi_result.body), type=_list_cats_200_decoder.type)
            __oapi_content = _encoder.encode(__oapi_body)
            return Response(__oapi_content, status_code=200, media_type="application/json")
        if isinstance(__oapi_result, _contracts.ListCats.NotFound):
            __oapi_body = convert(to_builtins(__oapi_result.body), type=_list_cats_404_decoder.type)
            __oapi_content = _encoder.encode(__oapi_body)
            return Response(__oapi_content, status_code=404, media_type="application/json")
        raise TypeError("listCats returned an unsupported response variant")

    async def __oapi_endpoint_create_cat(__oapi_http: Request) -> Response:
        try:
            __oapi_bytes = await __oapi_http.body()
            if __oapi_bytes:
                _runtime.check_json_content_type(__oapi_http.headers.get("content-type"))
            __oapi_body = _runtime.json_body(__oapi_bytes, _create_cat_body_decoder, required=True)
        except _runtime.RequestError as __oapi_error:
            return _runtime.error_response(__oapi_error)
        __oapi_request = _contracts.CreateCat.Request(body=__oapi_body)
        __oapi_result = await __oapi_handlers.cats.create_cat(__oapi_request)
        if isinstance(__oapi_result, _contracts.CreateCat.Created):
            return Response(status_code=201)
        raise TypeError("createCat returned an unsupported response variant")

    async def __oapi_endpoint_show_cat_by_id(__oapi_http: Request) -> Response:
        try:
            __oapi_parameter_0 = _runtime.parameter(
                __oapi_http.path_params.get("cat_id"),
                _show_cat_by_id_parameter_0,
                ("path", "catId"),
                required=True,
                default=None,
            )
        except _runtime.RequestError as __oapi_error:
            return _runtime.error_response(__oapi_error)
        __oapi_request = _contracts.ShowCatById.Request(cat_id=__oapi_parameter_0)
        try:
            __oapi_result = await __oapi_handlers.cats.show_cat_by_id(__oapi_request)
        except _contracts.ShowCatById.NotFound as __oapi_error:
            __oapi_result = __oapi_error
        else:
            if isinstance(__oapi_result, Exception):
                raise TypeError("showCatById error responses must be raised")
        if isinstance(__oapi_result, _contracts.ShowCatById.Ok):
            __oapi_body = convert(
                to_builtins(__oapi_result.body), type=_show_cat_by_id_200_decoder.type
            )
            __oapi_content = _encoder.encode(__oapi_body)
            return Response(__oapi_content, status_code=200, media_type="application/json")
        if isinstance(__oapi_result, _contracts.ShowCatById.NotFound):
            __oapi_body = convert(
                to_builtins(__oapi_result.body), type=_show_cat_by_id_404_decoder.type
            )
            __oapi_content = _encoder.encode(__oapi_body)
            return Response(__oapi_content, status_code=404, media_type="application/json")
        raise TypeError("showCatById returned an unsupported response variant")

    __oapi_routes = [
        Route(prefix + "/cats", __oapi_endpoint_list_cats, methods=["GET"], name="listCats"),
        Route(prefix + "/cats", __oapi_endpoint_create_cat, methods=["POST"], name="createCat"),
        Route(
            prefix + "/cats/{cat_id}",
            __oapi_endpoint_show_cat_by_id,
            methods=["GET"],
            name="showCatById",
        ),
    ]
    __oapi_routes[0].methods = {"GET"}
    __oapi_routes[2].methods = {"GET"}
    if include_schema:
        __oapi_schema = json.decode(Path(__file__).with_name("openapi.json").read_bytes())
        __oapi_schema["paths"] = {
            prefix + path: item for path, item in __oapi_schema["paths"].items()
        }
        __oapi_schema_bytes = _encoder.encode(__oapi_schema)

        async def __oapi_openapi(request: Request) -> Response:
            return Response(__oapi_schema_bytes, media_type="application/json")

        __oapi_routes.append(Route(prefix + "/openapi.json", __oapi_openapi))
    return Router(routes=__oapi_routes)
