const swaggerAutogen = require('swagger-autogen')({ openapi: '3.0.0' });
const fs = require('fs')
const path = require('path')

const doc = {
  info: {
    version: '1.0.0',
    title: 'AnythingLLM Developer API',
    description: 'API endpoints that enable programmatic reading, writing, and updating of your AnythingLLM instance. UI supplied by Swagger.io.',
  },
  // Swagger-autogen does not allow us to use relative paths as these will resolve to
  // http:///api in the openapi.json file, so we need to monkey-patch this post-generation.
  host: '/api',
  schemes: ['http'],
  securityDefinitions: {
    BearerAuth: {
      type: 'http',
      scheme: 'bearer',
      bearerFormat: 'JWT'
    }
  },
  security: [
    { BearerAuth: [] }
  ],
  definitions: {
    InvalidAPIKey: {
      message: 'Invalid API Key',
    },
  }
};

const outputFile = path.resolve(__dirname, './openapi.json');
const endpointsFiles = [
  '../endpoints/api/auth/index.js',
  '../endpoints/api/admin/index.js',
  '../endpoints/api/document/index.js',
  '../endpoints/api/workspace/index.js',
  '../endpoints/api/system/index.js',
];

swaggerAutogen(outputFile, endpointsFiles, doc)
  .then(({ data }) => {

    // Remove Authorization parameters from arguments.
    for (const path of Object.keys(data.paths)) {
      if (data.paths[path].hasOwnProperty('get')) {
        let parameters = data.paths[path].get?.parameters || [];
        parameters = parameters.filter((arg) => arg.name !== 'Authorization');
        data.paths[path].get.parameters = parameters;
      }

      if (data.paths[path].hasOwnProperty('post')) {
        let parameters = data.paths[path].post?.parameters || [];
        parameters = parameters.filter((arg) => arg.name !== 'Authorization');
        data.paths[path].post.parameters = parameters;
      }

      if (data.paths[path].hasOwnProperty('delete')) {
        let parameters = data.paths[path].delete?.parameters || [];
        parameters = parameters.filter((arg) => arg.name !== 'Authorization');
        data.paths[path].delete.parameters = parameters;
      }
    }

    const openApiSpec = {
      ...data,
      servers: [{
        url: "/api"
      }]
    }
    fs.writeFileSync(outputFile, JSON.stringify(openApiSpec, null, 2), { encoding: 'utf-8', flag: 'w' });
    console.log(`Swagger-autogen:  \x1b[32mPatched servers.url ✔\x1b[0m`)
  })