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

let external_apps;
let bs = null;

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 = () => {
    bs = 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();

export function reload() {
    if (bs) {
        bs.reload();
    }
}

