#!/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;

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;
}
