"use strict";

var gulp = require('gulp');

var path = require('path');

var bower = require('gulp-bower');
var exit = require('gulp-exit');
var gprocess = require('gulp-process');
var shell = require('gulp-shell');
var jasmineBrowser = require('gulp-jasmine-browser');
var webpack = require('webpack-stream');

gulp.task('bower', function(){
  return bower();
});

gulp.task('server', shell.task([
  'go build -o bin/example-server github.com/grpc-ecosystem/grpc-gateway/examples/server/cmd/example-server',
]));

gulp.task('gateway', shell.task([
  'go build -o bin/example-gw github.com/grpc-ecosystem/grpc-gateway/examples',
]));

gulp.task('serve-server', ['server'], function(){
  gprocess.start('server-server', 'bin/example-server', [
      '--logtostderr',
  ]);
  gulp.watch('bin/example-server', ['serve-server']);
});

gulp.task('serve-gateway', ['gateway', 'serve-server'], function(){
  gprocess.start('gateway-server', 'bin/example-gw', [
      '--logtostderr', '--swagger_dir', path.join(__dirname, "../examplepb"),
  ]);
  gulp.watch('bin/example-gateway', ['serve-gateway']);
});

gulp.task('backends', ['serve-gateway', 'serve-server']);

var specFiles = ['*.spec.js'];
gulp.task('test', ['backends'], function(done) {
  return gulp.src(specFiles)
    .pipe(webpack({output: {filename: 'spec.js'}}))
    .pipe(jasmineBrowser.specRunner({
      console: true,
      sourceMappedStacktrace: true,
    }))
    .pipe(jasmineBrowser.headless({
      findOpenPort: true,
      catch: true,
      throwFailures: true,
    }))
    .on('error', function(err) {
      done(err);
      process.exit(1);
    })
    .pipe(exit());
});

gulp.task('serve', ['backends'], function(done) {
  var JasminePlugin = require('gulp-jasmine-browser/webpack/jasmine-plugin');
  var plugin = new JasminePlugin();

  return gulp.src(specFiles)
    .pipe(webpack({
      output: {filename: 'spec.js'},
      watch: true,
      plugins: [plugin],
    }))
    .pipe(jasmineBrowser.specRunner({
      sourceMappedStacktrace: true,
    }))
    .pipe(jasmineBrowser.server({
      port: 8000,
      whenReady: plugin.whenReady,
    }));
});

gulp.task('default', ['test']);