/**
 * Copyright (c) HashiCorp, Inc.
 * SPDX-License-Identifier: BUSL-1.1
 */

const path = require('path');

const autolinkHeadings = require('remark-autolink-headings');
const prism = require('./lib/rehype-prism/index');
const refractor = require('refractor');
const gherkin = require('refractor/lang/gherkin');
const mermaid = require('refractor/lang/mermaid');
const handlebars = require('refractor/lang/handlebars');

const fs = require('fs');
const read = fs.readFileSync;
const exists = fs.existsSync;
const chalk = require('chalk'); // comes with ember

// allow extra docfy config
let user = { sources: [], labels: {} };
const $CONSUL_DOCFY_CONFIG = process.env.CONSUL_DOCFY_CONFIG || '';
if ($CONSUL_DOCFY_CONFIG.length > 0) {
  try {
    if (exists($CONSUL_DOCFY_CONFIG)) {
      user = JSON.parse(read($CONSUL_DOCFY_CONFIG));
    } else {
      throw new Error(`Unable to locate ${$CONSUL_DOCFY_CONFIG}`);
    }
  } catch (e) {
    console.error(chalk.yellow(`Docfy: ${e.message}`));
  }
}

refractor.register(gherkin);
refractor.register(mermaid);
refractor.register(handlebars);

refractor.alias({
  handlebars: ['hbs'],
  shell: ['sh'],
});

module.exports = {
  remarkHbsOptions: {
    escapeCurliesCode: false,
  },
  remarkPlugins: [
    autolinkHeadings,
    {
      behavior: 'wrap',
    },
  ],
  rehypePlugins: [prism],
  sources: [
    {
      root: path.resolve(__dirname, 'docs'),
      pattern: '**/*.mdx',
      urlSchema: 'auto',
      urlPrefix: 'docs',
    },
    {
      root: path.resolve(__dirname, 'app/styles'),
      pattern: '**/*.mdx',
      urlSchema: 'auto',
      urlPrefix: 'docs/styles',
    },
    {
      root: path.resolve(__dirname, 'app/services/repository'),
      pattern: '**/*.mdx',
      urlSchema: 'auto',
      urlPrefix: 'docs/repositories',
    },
    {
      root: path.resolve(__dirname, 'app/modifiers'),
      pattern: '**/*.mdx',
      urlSchema: 'auto',
      urlPrefix: 'docs/modifiers',
    },
    {
      root: path.resolve(__dirname, 'app/helpers'),
      pattern: '**/*.mdx',
      urlSchema: 'auto',
      urlPrefix: 'docs/helpers',
    },
    {
      root: path.resolve(__dirname, 'app/services'),
      pattern: '**/*.mdx',
      urlSchema: 'auto',
      urlPrefix: 'docs/services',
    },
    {
      root: path.resolve(__dirname, 'app/components'),
      pattern: '**(!consul)/README.mdx',
      urlSchema: 'auto',
      urlPrefix: 'docs/components',
    },
    {
      root: path.resolve(__dirname, 'app/components/consul'),
      pattern: '**/README.mdx',
      urlSchema: 'auto',
      urlPrefix: 'docs/consul',
    },
    {
      root: path.resolve(__dirname, 'app/components/providers'),
      pattern: '**/README.mdx',
      urlSchema: 'auto',
      urlPrefix: 'docs/providers',
    },
    {
      root: `${path.dirname(require.resolve('consul-acls/package.json'))}/app/components`,
      pattern: '**/README.mdx',
      urlSchema: 'auto',
      urlPrefix: 'docs/consul-acls',
    },
    {
      root: `${path.dirname(require.resolve('consul-lock-sessions/package.json'))}/app/components`,
      pattern: '**/README.mdx',
      urlSchema: 'auto',
      urlPrefix: 'docs/consul-lock-sessions',
    },
    {
      root: `${path.dirname(require.resolve('consul-peerings/package.json'))}/app/components`,
      pattern: '**/README.mdx',
      urlSchema: 'auto',
      urlPrefix: 'docs/consul-peerings',
    },
    {
      root: `${path.dirname(require.resolve('consul-partitions/package.json'))}/app/components`,
      pattern: '**/README.mdx',
      urlSchema: 'auto',
      urlPrefix: 'docs/consul-partitions',
    },
    {
      root: `${path.dirname(require.resolve('consul-nspaces/package.json'))}/app/components`,
      pattern: '**/README.mdx',
      urlSchema: 'auto',
      urlPrefix: 'docs/consul-nspaces',
    },
  ].concat(user.sources),
  labels: {
    consul: 'Consul Components',
    providers: 'Provider Components',
    ...user.labels,
  },
};
