#!/usr/bin/env node

'use strict';

var fs = require('fs');
var Promise = require('bluebird');
var through = require('through2');
var _derequire = require('derequire');
var watchify = require('watchify');
var browserify = require('browserify');
var cors_proxy = require('corsproxy');
var http_proxy = require('pouchdb-http-proxy');
var http_server = require('http-server');
var mkdirp = require('mkdirp');

function derequire() {
  var out = new Buffer('');
  return through(function (data, _, next) {
    out = Buffer.concat([out, data]);
    next();
  }, function (next) {
    this.push(_derequire(out.toString()));
    next();
  });
}
var queryParams = {};

if (process.env.ES5_SHIM || process.env.ES5_SHIMS) {
  queryParams.es5shim = true;
}
if (process.env.ADAPTERS) {
  queryParams.adapters = process.env.ADAPTERS;
}
if (process.env.AUTO_COMPACTION) {
  queryParams.autoCompaction = true;
}

var indexfile = "./lib/index.js";
var outfile = "./dist/pouchdb.js";
var perfRoot = './tests/performance/';
var performanceBundle = './tests/performance-bundle.js';

var w = watchify(browserify(indexfile, {
  standalone: "PouchDB",
  cache: {},
  packageCache: {},
  fullPaths: true
})).on('update', bundle);
var b = watchify(browserify({
    entries: perfRoot,
    cache: {},
    packageCache: {},
    fullPaths: true
  })).on('update', bundlePerfTests);

function bundle(callback) {
  mkdirp.sync('./dist');
  w.bundle().pipe(derequire()).pipe(fs.createWriteStream(outfile))
  .on('finish', function () {
    console.log('Updated: ', outfile);
    if (typeof callback === 'function') {
      callback();
    }
  });
}

function bundlePerfTests(callback) {
   
  b.bundle().pipe(fs.createWriteStream(performanceBundle))
  .on('finish', function () {
    console.log('Updated: ', performanceBundle);
    if (typeof callback === 'function') {
      callback();
    }
  });

}

var filesWritten = false;
Promise.all([
  new Promise(function (resolve) {
    bundle(resolve);
  }),
  new Promise(function (resolve) {
    bundlePerfTests(resolve);
  })
]).then(function () {
  filesWritten = true;
  checkReady();
});

var COUCH_HOST = process.env.COUCH_HOST || 'http://127.0.0.1:5984';

var HTTP_PORT = 8000;
var CORS_PORT = 2020;

// if SERVER=sync-gateway we also have 
// tests/misc/sync-gateway-config-server.js 
// listening on port 8001

var serversStarted;
var readyCallback;

function startServers(callback) {
  readyCallback = callback;
  http_server.createServer().listen(HTTP_PORT, function () {
    cors_proxy.options = {target: COUCH_HOST};
    http_proxy.createServer(cors_proxy).listen(CORS_PORT, function () {
      var testRoot = 'http://127.0.0.1:' + HTTP_PORT;
      var query = '';
      Object.keys(queryParams).forEach(function (key) {
        query += (query ? '&' : '?');
        query += key + '=' + encodeURIComponent(queryParams[key]);
      });
      console.log('Integration tests: ' + testRoot +
        '/tests/integration/' + query);
      console.log('Performance tests: ' + testRoot +
        '/tests/performance/');
      serversStarted = true;
      checkReady();
    });
  });
}

function checkReady() {
  if (filesWritten && serversStarted && readyCallback) {
    readyCallback();
  }
}


if (require.main === module) {
  startServers();
} else {
  module.exports.start = startServers;
}
