/**
 * This script generates API documentation files in the target folder.
 * Usage: `$ yarn build:api-docs <path>` creates the .md files in <path>.
 * Example: `$ yarn build:api-docs path/to/theatre-docs/docs/api/`
 *
 * Usually <path> is https://github.com/AriaMinaei/theatre-docs/tree/main/docs/api
 */
import path from 'path'
import {parse as parseJsonC} from 'jsonc-parser'
;(async function () {
  // better quote function from https://github.com/google/zx/pull/167
  $.quote = function quote(arg) {
    if (/^[a-z0-9/_.-]+$/i.test(arg)) {
      return arg
    }
    return (
      `$'` +
      arg
        .replace(/\\/g, '\\\\')
        .replace(/'/g, "\\'")
        .replace(/\f/g, '\\f')
        .replace(/\n/g, '\\n')
        .replace(/\r/g, '\\r')
        .replace(/\t/g, '\\t')
        .replace(/\v/g, '\\v')
        .replace(/\0/g, '\\0') +
      `'`
    )
  }

  const outputPathArg = argv._[argv._.length - 1]
  if (outputPathArg.trim().length === 0) {
    console.error(
      `You must provide a path to create the markdown files in. Eg. $ yarn build:api-docs /path/to/docs-site/docs/api`,
    )
    process.exit(1)
  }
  const outputPath = path.resolve(outputPathArg)

  const pathToApiJsonFiles = path.dirname(
    path.resolve(
      './devEnv',
      parseJsonC(
        fs.readFileSync('./devEnv/api-extractor-base.json', {
          encoding: 'utf-8',
        }),
      ).docModel.apiJsonFilePath,
    ),
  )

  await $`yarn build:ts`
  await Promise.all(
    ['@theatre/dataverse', '@theatre/react', 'theatre'].map(
      (pkg) => $`yarn workspace ${pkg} run build:api-json`,
    ),
  )
  await $`api-documenter markdown --input-folder ${pathToApiJsonFiles} --output-folder ${outputPath}`
})()
