import gulp from 'gulp';
import browserSync from 'browser-sync';
import fs from 'fs';
import webserver from 'gulp-webserver';
import proxy from 'http-proxy-middleware';

console.log(proxy)

let external_apps;

const files = ['../../web/gui/src/main/webapp/**/*.js'];
const defaultViews = fs.readdirSync('../../web/gui/src/main/webapp/app/view/');
const viewNameMatcher = new RegExp(/\/onos\/ui\/app\/view\/(.+)\/.+\.(?:js|css|html)/);

if (process.env.ONOS_EXTERNAL_APP_DIRS) {
    let external_apps = process.env.ONOS_EXTERNAL_APP_DIRS.replace(/\s/,'').split(',');

    external_apps = external_apps.reduce(function (dict, app) {
        const pieces = app.split(':');
        const appName = pieces[0];
        const appPath = pieces[1];
        dict[appName] = appPath;
        return dict;
    }, {});
}

const checkExternalApp = (url) => {
    if(external_apps){
        for(let i = 0; i < Object.keys(external_apps).length; i++){
            const key = Object.keys(external_apps)[i];
            if (url.indexOf(key) !== -1) {
                return key;
            }
        }
    }
    return false;
};

const serve = () => {
    browserSync.init({
        proxy: {
            target: 'http://localhost:8181',
            ws: true,
            middleware: [
                proxy(['**/*.js', '!/onos/ui/onos.js'], { target: 'http://localhost:8189' }),
                proxy('**/*.js.map', {
                    target: 'http://localhost:8189',
                    changeOrigin: true,
                    logLevel: 'debug'
                })
            ]
        }
    });
};

const tasks = () => {
    gulp.task('serve', ['bundle-js', 'proxy-server'], serve);
    gulp.task('proxy-server', function() {
        gulp.src('../../web/gui/src/main/webapp')
            .pipe(webserver({
                port: 8189,
                path: '/onos/ui/'
            }));
    });
};

export default tasks();


