const fetch = require('node-fetch');
const fs = require('fs');
const prettier = require('prettier');

function writeFile(path, contents) {
  return new Promise((resolve, reject) => {
    fs.writeFile(path, contents, err => {
      if (err) reject(err);
      resolve();
    });
  });
}

async function writeMapping(data) {
  const contents = `const emojiShortcodes = ${JSON.stringify(data, null, 2)};
    
    export type Shortcode = keyof typeof emojiShortcodes;
    export default emojiShortcodes;`;

  const configFile = await prettier.resolveConfigFile(
    'src/utils/emojiShortcodes.ts'
  );
  const config = await prettier.resolveConfig(configFile);
  const formattedContents = prettier.format(contents, {
    ...config,
    parser: 'typescript'
  });
  await writeFile('src/utils/emojiShortcodes.ts', formattedContents);
}

function fullyQualified(line) {
  return line.includes('; fully-qualified');
}

function slugify(text) {
  return text
    .toString()
    .toLowerCase()
    .replace(/\s+/g, '-') // Replace spaces with -
    .replace(/[^\w\-]+/g, '') // Remove all non-word chars
    .replace(/\-\-+/g, '-') // Replace multiple - with single -
    .replace(/^-+/, '') // Trim - from start of text
    .replace(/-+$/, ''); // Trim - from end of text
}

function parseEmoji(l) {
  const components = l
    .split(';')[0]
    .trim()
    .split(' ');
  const emoji = components
    .map(s => String.fromCodePoint(parseInt(s, 16)))
    .join('');

  const description = l.split('#')[1];
  const shortcode = `:${slugify(description)}:`;
  return { shortcode, emoji };
}

(async () => {
  const res = await fetch(
    'https://unicode.org/Public/emoji/12.0/emoji-test.txt'
  );
  const rawData = await res.text();
  const lines = rawData.split('\n');
  const parsedEmoji = lines.filter(fullyQualified).map(parseEmoji);
  const mapping = parsedEmoji.reduce((a, b) => {
    a[b.shortcode] = b.emoji;
    return a;
  }, {});
  await writeMapping(mapping);
})();