const fs = require("fs");
const path = require("path");
const swaggerUi = require("swagger-ui-express");

function faviconUrl() {
  return process.env.NODE_ENV === "production"
    ? "/public/favicon.png"
    : "http://localhost:3000/public/favicon.png";
}

function useSwagger(app) {
  if (process.env.DISABLE_SWAGGER_DOCS === "true") {
    console.log(
      `\x1b[33m[SWAGGER DISABLED]\x1b[0m Swagger documentation is disabled via DISABLE_SWAGGER_DOCS environment variable.`
    );
    return;
  }
  app.use("/api/docs", swaggerUi.serve);
  const options = {
    customCss: [
      fs.readFileSync(path.resolve(__dirname, "index.css")),
      fs.readFileSync(path.resolve(__dirname, "dark-swagger.css")),
    ].join("\n\n\n"),
    customSiteTitle: "AnythingLLM Developer API Documentation",
    customfavIcon: faviconUrl(),
  };

  if (process.env.NODE_ENV === "production") {
    const swaggerDocument = require("./openapi.json");
    app.get(
      "/api/docs",
      swaggerUi.setup(swaggerDocument, {
        ...options,
        customJsStr:
          'window.SWAGGER_DOCS_ENV = "production";\n\n' +
          fs.readFileSync(path.resolve(__dirname, "index.js"), "utf8"),
      })
    );
  } else {
    // we regenerate the html page only in development mode to ensure it is up-to-date when the code is hot-reloaded.
    app.get("/api/docs", async (_, response) => {
      // #swagger.ignore = true
      const swaggerDocument = require("./openapi.json");
      return response.send(
        swaggerUi.generateHTML(swaggerDocument, {
          ...options,
          customJsStr:
            'window.SWAGGER_DOCS_ENV = "development";\n\n' +
            fs.readFileSync(path.resolve(__dirname, "index.js"), "utf8"),
        })
      );
    });
  }
}

module.exports = { faviconUrl, useSwagger };
