const gulp = require('gulp');
const nodemon = require('nodemon');
const path = require('path');
const webpack = require('webpack');
const fs = require('fs');
const nodeExternals = require('webpack-node-externals');

const config = {
    target: 'node',
    entry: [path.join(__dirname, '/src/ts/server.ts')],
    output: {
        path: path.join(__dirname, '/server'),
        filename: 'server.js',
    },
    devtool: 'source-map',
    resolve: {
        modules: [
            path.join(__dirname, '/src/ts'),
            'node_modules',
        ],
        extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'],
        alias: {
            ts: path.join(__dirname, '/src/ts'),
            contract_artifacts: path.join(__dirname, '/src/contract_artifacts'),
        },
    },
    module: {
        rules: [
            {
                test: /\.js$/,
                loader: 'source-map-loader',
            },
            {
                test: /\.tsx?$/,
                loader: 'awesome-typescript-loader',
            },
        ],
    },
    plugins: [
        new webpack.BannerPlugin({
            banner: 'require("source-map-support").install();',
            raw: true,
            entryOnly: false,
        }),
    ],
    externals: nodeExternals({
        modulesDir: path.join(__dirname, '../../node_modules')
    }),
    watchOptions: {
        ignored: /server|node_modules|transpiled/
    },
};

gulp.task('build', function(done) {
    webpack(config).run(onBuild(done));
});

gulp.task('watch', function() {
    webpack(config).watch(100, function(err, stats) {
        onBuild()(err, stats);
        nodemon.restart();
    });
});

gulp.task('run', ['watch'], function() {
    nodemon({
        execMap: {
            js: 'node',
        },
        script: path.join(__dirname, 'server/server'),
        ignore: ['*'],
        watch: ['foo/'],
        ext: 'noop',
    }).on('restart', function() {
        console.log('Restarted!');
    });
});

function onBuild(done) {
  return function(err, stats) {
    if(err) {
      console.log('Error', err);
    }
    else {
      console.log(stats.toString());
    }

    if(done) {
      done();
    }
  }
}
