/*
TODO:
 - Use gulp streams
 - Use polymer bundler to vulcanize
*/
var gulp = require('gulp');
var Vulcanize = require('vulcanize');
var minify = require('html-minifier');
var fs = require('fs');

function minifyHTML(html) {
  return minify.minify(html, {
    customAttrAssign: [/\$=/],
    removeComments: true,
    removeCommentsFromCDATA: true,
    removeCDATASectionsFromCDATA: true,
    collapseWhitespace: true,
    removeScriptTypeAttributes: true,
    removeStyleLinkTypeAttributes: true,
    minifyJS: true,
    minifyCSS: true,
  });
}

const baseVulcanOptions = {
  inlineScripts: true,
  inlineCss: true,
  implicitStrip: true,
  stripComments: true,
};

const baseExcludes = [
  'bower_components/font-roboto/roboto.html',
  'bower_components/paper-styles/color.html',
];

const toProcess = [
  // This is the Hass.io configuration panel
  // It's build standalone because it is embedded in the supervisor.
  {
    source: './panels/hassio/hassio-main.html',
    output: './build-temp/hassio-main.html',
    vulcan: new Vulcanize(Object.assign({}, baseVulcanOptions, {
      stripExcludes: baseExcludes.concat([
        'bower_components/polymer/polymer.html',
        'bower_components/iron-meta/iron-meta.html',
      ]),
    })),
  },
];

function vulcanizeEntry(entry) {
  return new Promise((resolve, reject) => {
    console.log('Processing', entry.source);
    entry.vulcan.process(entry.source, (err, inlinedHtml) => {
      if (err !== null) {
        reject(`${entry.source}: ${err}`);
        return;
      }

      console.log('Writing', entry.output);
      fs.writeFileSync(entry.output, minifyHTML(inlinedHtml));
      resolve();
    });
  });
}

gulp.task('hassio-panel', () => {
  if (!fs.existsSync('build-temp')) {
    fs.mkdirSync('build-temp');
  }

  toProcess.reduce(
        (p, entry) => p.then(() => vulcanizeEntry(entry)),
        Promise.resolve());

  return toProcess;
});