'use strict';

var fs      = require('fs')
var runner  = require('urbit-runner')
var Urbit   = runner.Urbit;
var ERROR   = runner.ERROR;
var actions = runner.actions

var args  = ['-B', 'urbit.pill', '-A', '..', '-cSF', 'zod', 'zod'];
var urbit = new Urbit(args);

//  XX upstream this into runner-js
//
function rePill(urb) {
  return new Promise(function(resolve,reject){
    fs.stat('./built-pill/', function(err, stat) {
      if (err) return resolve()

      fs.readdir('./built-pill/', function(err, files) {
        if (err || (1 !== files.length)) {
          return resolve()
        }

        var name = files[0].replace(/\.pill$/, '')

        urb.note('re-soliding pill')

        return urb.expect(/dojo> /)
        .then(function(){
          return urb.line('|label %home %' + name)
        })
        .then(function(){
          return urb.expect(/dojo> /)
        })
        .then(function(){
          return urb.line('.latest/pill +solid /==/' + name + '/sys')
        })
        .then(function(){
          return urb.expectEcho("%resolid")
        })
        .then(function(){
          return urb.resetListeners();
        })
        .then(function(){
          var write = fs.createWriteStream('./built-pill/' + name + '.pill')
          var read = fs.createReadStream('./zod/.urb/put/latest.pill')

          read.on('error', function(err){
            return reject(err)
          })

          write.on('error', function(err){
            return reject(err)
          })

          write.on('finish', function(){
            return resolve()
          })

          return read.pipe(write)
        })
        //  XX find a better way to add this to the promise chain
        //
        .then(function(){
          return barMass(urb);
        })
        .catch(function(err){
          return reject(err)
        });
      })
    })
  })
}

//  XX upstream this into runner-js
//
function barMass(urb) {
  return urb.line("|mass")
  .then(function(){
    return urb.expectEcho("%ran-mass")
    .then(function(){ return urb.resetListeners(); })
  })
}

Promise.resolve(urbit)
//  XX temporary
//  send ctrl-x to select dojo
//
.then(function(){
  return urbit.expect(/talk\[\] /)
  .then(function() {
    return urbit.pty.write("\x18")
  })
  .then(function() { return urbit })
})
.then(actions.safeBoot)
.then(function(){
  return barMass(urbit);
})
.then(actions.test)
.then(actions.testCores)
.then(actions.testRenderers)
.then(function(){
  return barMass(urbit);
})
.then(function(){
  return rePill(urbit);
})
.then(function(){
  return urbit.exit(0);
})
.catch(function(err){
  return urbit.waitSilent()
  .then(function(){
    urbit.warn('Test aborted:', err);
    return urbit.exit(1);
  });
});

@@ -2099,213 +2099,8 @@
 it)%0A
-//  XX temporary%0A//  send ctrl-x to select dojo%0A//%0A.then(function()%7B%0A  return urbit.expect(/talk%5C%5B%5C%5D /)%0A  .then(function() %7B%0A    return urbit.pty.write(%22%5Cx18%22)%0A  %7D)%0A  .then(function() %7B return urbit %7D)%0A%7D)%0A
 .the

Remove ^x from test travis tests