/*
  This is the analyzer script that generates the snippetAnalytics.json and snippetArchiveAnalytics.json files.
  Run using `npm run analyzer`.
*/
// Load modules
const fs = require('fs-extra');
const path = require('path');
const chalk = require('chalk');
const prism = require('prismjs');
let snippetsData = require('../snippet_data/snippets.json');
let snippetsArchiveData = require('../snippet_data/snippetsArchive.json');
// Paths
const OUTPUT_PATH = './snippet_data';
console.time('Analyzer');
// Read data
let [snippetTokens, snippetArchiveTokens] = [snippetsData, snippetsArchiveData].map(v => ({
  data: v.data.map(snippet => {
    let tokens = prism.tokenize(
      snippet.attributes.codeBlocks[0],
      prism.languages.javascript,
      'javascript'
    );
    return {
      id: snippet.id,
      type: 'snippetAnalysis',
      attributes: {
        codeLength: snippet.attributes.codeBlocks[0].trim().length,
        tokenCount: tokens.length,
        functionCount: tokens.filter(t => t.type === 'function').length,
        operatorCount: tokens.filter(t => t.type === 'operator').length,
        keywordCount: tokens.filter(t => t.type === 'keyword').length,
        distinctFunctionCount: [
          ...new Set(tokens.filter(t => t.type === 'function').map(t => t.content))
        ].length
      },
      meta: {
        hash: snippet.meta.hash
      }
    };
  }),
  meta: { specification: 'http://jsonapi.org/format/' }
}));
// Write data
fs.writeFileSync(
  path.join(OUTPUT_PATH, 'snippetAnalytics.json'),
  JSON.stringify(snippetTokens, null, 2)
);
fs.writeFileSync(
  path.join(OUTPUT_PATH, 'snippetArchiveAnalytics.json'),
  JSON.stringify(snippetArchiveTokens, null, 2)
);
// Display messages and time
console.log(
  `${chalk.green(
    'SUCCESS!'
  )} snippetAnalyticss.json and snippetArchiveAnalytics.json files generated!`
);
console.timeEnd('Analyzer');
