// Native
const { createHash } = require('crypto');
const path = require('path');

// Packages
const { readFile } = require('fs-promise');

/**
  * Computes hashes for the contents of each file given.
  *
  * @param {Array} of {String} full paths
  * @return {Map}
  */

async function hashes(files, isStatic, pkg) {
  const map = new Map();

  await Promise.all(
    files.map(async name => {
      const filename = path.basename(name);
      let data;

      if (isStatic && filename === 'package.json') {
        const packageString = JSON.stringify(pkg, null, 2);
        data = Buffer.from(packageString);
      } else {
        data = await readFile(name);
      }

      const h = hash(data);
      const entry = map.get(h);
      if (entry) {
        entry.names.push(name);
      } else {
        map.set(hash(data), { names: [name], data });
      }
    })
  );
  return map;
}

/**
 * Computes a hash for the given buf.
 *
 * @param {Buffer} file data
 * @return {String} hex digest
 */

function hash(buf) {
  return createHash('sha1').update(buf).digest('hex');
}

module.exports = hashes;