import { validationMetadatasToSchemas } from "class-validator-jsonschema";
import express, { Application } from "express";
import path from 'path';
import { getMetadataArgsStorage } from "routing-controllers";
import { routingControllersToSpec } from "routing-controllers-openapi";

/**
 * Loader for everything openapi related - from creating the schema to serving it via a static route and swaggerUiExpress.
 * All auth schema related stuff also has to be configured here
 */
export default async (app: Application) => {
  const storage = getMetadataArgsStorage();
  const schemas = validationMetadatasToSchemas({
    refPointerPrefix: "#/components/schemas/",
  });

  //Spec creation based on the previously created schemas
  const spec = routingControllersToSpec(
    storage,
    {
      routePrefix: "/api"
    },
    {
      components: {
        schemas,
        "securitySchemes": {
          "AuthToken": {
            "type": "http",
            "scheme": "bearer",
            "bearerFormat": "JWT",
            description: "A JWT based access token. Use /api/auth/login or /api/auth/refresh to get one."
          },
          "RefreshTokenCookie": {
            "type": "apiKey",
            "in": "cookie",
            "name": "lfk_backend__refresh_token",
            description: "A cookie containing a JWT based refreh token. Attention: Doesn't work in swagger-ui. Use /api/auth/login or /api/auth/refresh to get one."
          },
          "StatsApiToken": {
            "type": "http",
            "scheme": "bearer",
            description: "Api token that can be obtained by creating a new stats client (post to /api/statsclients)."
          }
        }
      },
      info: {
        description: "The the backend API for the LfK! runner system.",
        title: "LfK! Backend API",
        version: "0.0.5",
      },
    }
  );
  app.get(["/api/docs/openapi.json", "/api/docs/swagger.json"], (req, res) => {
    res.json(spec);
  });
  app.use('/api/docs', express.static(path.join(__dirname, '../static/docs'), { index: "index.html", extensions: ['html'] }));
  return app;
};
