/**
 * Copyright (c) 2017-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

// split markdown header
function splitHeader(content) {
  // New line characters need to handle all operating systems.
  const lines = content.split(/\r?\n/);
  if (lines[0] !== '---') {
    return {};
  }
  let i = 1;
  for (; i < lines.length - 1; ++i) {
    if (lines[i] === '---') {
      break;
    }
  }
  return {
    header: lines.slice(1, i + 1).join('\n'),
    content: lines.slice(i + 1).join('\n'),
  };
}

// Extract markdown metadata header
function extractMetadata(content) {
  const metadata = {};
  const both = splitHeader(content);

  // if no content returned, then that means there was no header, and both.header is the content
  if (!both.content) {
    if (!both.header) {
      // if no both returned, then that means there was no header and no content => we return the current content of the file
      return {metadata, rawContent: content};
    }
    return {metadata, rawContent: both.header};
  }

  // New line characters => to handle all operating systems.
  const lines = both.header.split(/\r?\n/);

  // Loop that add to metadata the current content of the fields of the header
  // Like the format:
  // id:
  // title:
  // original_id:
  for (let i = 0; i < lines.length - 1; ++i) {
    const keyvalue = lines[i].split(':');
    const key = keyvalue[0].trim();
    let value = keyvalue
      .slice(1)
      .join(':')
      .trim();
    try {
      value = JSON.parse(value);
    } catch (err) {
      // Ignore the error as it means it's not a JSON value.
    }
    metadata[key] = value;
  }
  return {metadata, rawContent: both.content};
}

// mdToHtml is a map from a markdown file name to its html link, used to
// change relative markdown links that work on GitHub into actual site links
function mdToHtml(Metadata, siteConfig) {
  const {baseUrl, docsUrl} = siteConfig;
  const result = {};
  Object.keys(Metadata).forEach(id => {
    const metadata = Metadata[id];
    if (metadata.language !== 'en' || metadata.original_id) {
      return;
    }
    let htmlLink = baseUrl + metadata.permalink.replace('/next/', '/');

    const baseDocsPart = `${baseUrl}${docsUrl ? `${docsUrl}/` : ''}`;

    const i18nDocsRegex = new RegExp(`^${baseDocsPart}en/`);
    const docsRegex = new RegExp(`^${baseDocsPart}`);
    if (i18nDocsRegex.test(htmlLink)) {
      htmlLink = htmlLink.replace(i18nDocsRegex, `${baseDocsPart}en/VERSION/`);
    } else {
      htmlLink = htmlLink.replace(docsRegex, `${baseDocsPart}VERSION/`);
    }
    result[metadata.source] = htmlLink;
  });
  return result;
}

module.exports = {
  extractMetadata,
  mdToHtml,
};
