#!/usr/bin/env node

'use strict';

var fs = require('fs');

var http_server = require('http-server');
var execSync = require('exec-sync');
var mkdirp = require('mkdirp');
var watchGlob = require('watch-glob');

var POUCHDB_CSS = __dirname + '/../docs/static/css/pouchdb.css';
var POUCHDB_LESS = __dirname + '/../docs/static/less/pouchdb/pouchdb.less';

if (!execSync('gem list jekyll -i')) {
  console.log('Install Jekyll');
  process.exit(1);
}

mkdirp.sync(__dirname + '/../docs/static/css');

function buildCSS() {
  var css =
    execSync(__dirname + '/../node_modules/less/bin/lessc ' + POUCHDB_LESS);
  fs.writeFileSync(POUCHDB_CSS, css);
  console.log('Updated: ', POUCHDB_CSS);
}

if (!process.env.BUILD) {
  watchGlob('docs/static/less/*/*.less', buildCSS);
}
buildCSS();

process.chdir('docs');

function buildJekyll(path) {
  // Dont rebuild on website artifacts being written
  if (path && /^_site/.test(path.relative)) {
    return;
  }
  execSync('jekyll build');
  console.log('=> Rebuilt jekyll');
}

if (!process.env.BUILD) {
  watchGlob('**', buildJekyll);
  buildJekyll();
  http_server.createServer({root: '_site', cache: '-1'}).listen(4000);
  console.log('Server address: http://0.0.0.0:4000');
} else {
  execSync('jekyll build');
}
