'use strict';
/*
 * Build javascript passthrough modules for highlight.js languages
 */
const path = require('path');
const fs = require('fs');
const camel = require('to-camel-case');
const autogenMessage =
  '//\n// This file has been auto-generated by the `npm run build-languages-prism` task\n//\n\n';

function makeImportName(name) {
  if (name === '1c') {
    return 'oneC';
  }
  if (name === 'false') {
    return 'falselang';
  }
  return camel(name);
}

function createLanguagePassthroughModule(file) {
  const fileWithoutJS = file.split('.js')[0];
  const importName = makeImportName(fileWithoutJS);
  const lines = [
    `import ${importName} from "refractor/${fileWithoutJS}"`,
    `export default ${importName}`,
    ''
  ];

  fs.writeFile(
    path.join(__dirname, `../src/languages/prism/${file}`),
    lines.join(';\n'),
    err => {
      if (err) {
        process.exit(1);
      }
    }
  );
}

function createAsyncLanguageLoaderLine(file) {
  const fileWithoutJS = file.split('.js')[0];
  const importName = makeImportName(fileWithoutJS);

  return `  ${importName}: createLanguageAsyncLoader("${importName}", () => import(/* webpackChunkName: "react-syntax-highlighter_languages_refractor_${importName}" */ "refractor/${fileWithoutJS}")),`;
}

function createSupportedLanguagesArray(files) {
  let lines = [autogenMessage, `export default [`];
  lines = lines.concat(files.map(file => `\n  '${file.split('.js')[0]}',`));
  lines.push(`\n];\n`);

  fs.writeFile(
    path.join(__dirname, `../src/languages/prism/supported-languages.js`),
    lines.join(''),
    err => {
      if (err) {
        throw err;
      }
    }
  );
}

function createAsyncLanguageLoadersIndex(files) {
  let lines = [
    `import createLanguageAsyncLoader from "./create-language-async-loader"`,
    `export default {`
  ];

  lines = lines.concat(files.map(file => createAsyncLanguageLoaderLine(file)));
  lines.push(`}`);

  fs.writeFile(
    path.join(__dirname, `../src/async-languages/prism.js`),
    lines.join('\n'),
    err => {
      if (err) {
        throw err;
      }
    }
  );
}

fs.readdir(
  path.join(__dirname, '../node_modules/refractor/lang'),
  (err, files) => {
    files = files.filter(file => file.endsWith('.js'));
    console.log(files);
    if (err) {
      process.exit(1);
    }
    files.forEach(createLanguagePassthroughModule);

    createAsyncLanguageLoadersIndex(files);
    createSupportedLanguagesArray(files);

    const availableLanguageNames = files.map(file => file.split('.js')[0]);
    console.log(availableLanguageNames.join('\n'));
    const languagesLi = availableLanguageNames.map(
      name =>
        `\n* ${makeImportName(name)}${
          makeImportName(name) !== name ? ` (${name})` : ''
        }`
    );
    const languageMD = `## Available \`language\` imports ${languagesLi.join(
      ''
    )}`;
    fs.writeFile(
      path.join(__dirname, '../AVAILABLE_LANGUAGES_PRISM.MD'),
      languageMD,
      err => {
        if (err) {
          process.exit(1);
        }
      }
    );

    const defaultExports = availableLanguageNames.map(
      name =>
        `export { default as ${makeImportName(name)} } from './${name}';\n`
    );
    fs.writeFile(
      path.join(__dirname, '../src/languages/prism/index.js'),
      defaultExports.join(''),
      err => {
        if (err) {
          process.exit(1);
        }
      }
    );
  }
);
