import Router from "@koa/router";
import Koa, { DefaultState, Context, Middleware } from "koa";
import { bootstrapControllers, Ctx } from "@iceshrimp/koa-openapi";
import { ILocalUser } from "@/models/entities/user.js";
import { AccessToken } from "@/models/entities/access-token.js";
import { UserController } from "@/server/api/web/controllers/user.js";
import { RatelimitMiddleware } from "@/server/api/web/middleware/rate-limit.js";
import { AuthenticationMiddleware } from "@/server/api/web/middleware/auth.js";
import { ErrorHandlingMiddleware } from "@/server/api/web/middleware/error-handling.js";

export type WebRouter = Router<WebState, WebContext>;
export type WebMiddleware = Middleware<WebState, WebContext>;

export interface WebState extends DefaultState {}

export interface WebContext extends Context {
	user: ILocalUser | null;
	token: AccessToken | null;
}

export class WebAPI {
	private readonly router: WebRouter;

	constructor(prefix: string) {
		this.router = new Router<DefaultState, WebContext>({ prefix });
	}

	public async setup(app: Koa): Promise<void> {
        await bootstrapControllers({
			app: app,
			router: this.router,
			attachRoutes: true,
			errorHandler: ErrorHandlingMiddleware,
			controllers: [
				UserController,
			],
			flow: [
				AuthenticationMiddleware,
				RatelimitMiddleware,
			],
			versions: {
				1: true
			},
			bodyParser: {
				multipart: true,
			},
			openAPI: {
				enabled: true,
				publicURL: '/api/iceshrimp',
				options: {
					title: "Iceshrimp Web API documentation"
				},
				spec: {
					info: {
						title: "Iceshrimp Web API",
						description: "Documentation for using Iceshrimp's Web API",
						version: "1.0.0"
					}
				}
			},
		});
	}
}