'use strict';

const proxy = require('http-proxy-middleware');

let localDevConfig = {};
try {
	localDevConfig = require('./devConfig');
} catch (e) {}
const devConfig = Object.assign({}, require('./devConfig.defaults'), localDevConfig);
let devPort = process.env.PORT || devConfig.port;


module.exports = function (server) {
	let cookieRules = devConfig.proxyConfig.cookieReplaceRules;
	let cookies = devConfig.proxyConfig.cookies;
	console.log('---------------------');

	let proxyConfigDefaults = {
		changeOrigin: true,
		secure: false,
		onProxyRes: (proxyRes, req, res) => {
			let setCookie = proxyRes.headers['set-cookie'];
			if (setCookie) {
				cookieRules.forEach(function(rule) {
					setCookie[0] = setCookie[0].replace(rule.replace, rule.with);
				});
			}
			if (proxyRes.statusCode === 302 && proxyRes.headers.location.indexOf(devConfig.proxyConfig.login) > -1) {
				proxyRes.headers.location = `http://localhost:${devPort}/${devConfig.proxyConfig.redirectionPath}`;
				let myCookies = [];
				for (let cookie in cookies) {
					myCookies.push(cookie + '=' + cookies[cookie]);
				}
				res.setHeader('Set-Cookie', myCookies);
			}
		}
	};

	let middlewares = [
		(req, res, next) => {
			devConfig.proxyConfig.urlReplaceRules.forEach(function(rule) {
				if (req.url.indexOf(rule.url) > -1) {
					req.url = req.url.replace(rule.replace, rule.with);
				}
			});
			devConfig.proxyConfig.jsReplaceRules.forEach(function(rule) {
				let regex = new RegExp('^(.*)' + rule.replace);
				let match = req.url.match(regex);
				let newUrl = match && match[1] + rule.with + '.js';
				if (newUrl) {
					console.log(`REWRITING URL: ${req.url} -> ${newUrl}`);
					req.url = newUrl;
				}
			});
			next();
		}
	];


	let proxies = [];

	// standalone back-end (proxyTarget) has higher priority, so it should be first
	if (devConfig.proxyTarget) {
		console.log('Onboarding proxy set to : ' + devConfig.proxyTarget);
		proxies.push({
			target : devConfig.proxyTarget,
			config: devConfig.proxyConfig.onboardingProxy}
		);
	} else {
		console.log('Catalog proxy set to : ' + devConfig.proxyCatalogTarget);
	}
	console.log('Catalog proxy set to : ' + devConfig.proxyCatalogTarget);
	proxies.push({
		target : devConfig.proxyCatalogTarget,
		config: devConfig.proxyConfig.catalogProxy}
	);
	proxies.forEach(function(p) {
		middlewares.push(
			proxy(p.config.proxy, Object.assign({}, proxyConfigDefaults, {
				target: p.target,
				pathRewrite: p.config.rewrite
			}))
		);

	});

	let websocketTarget = devConfig.proxyCatalogTarget;
	if (devConfig.proxyWebsocketTarget) {
		websocketTarget = devConfig.proxyWebsocketTarget;
	}
	console.log('Websocket proxy set to : ' + websocketTarget);
	console.log('---------------------');
	var wsProxy = proxy(devConfig.proxyConfig.websocketProxy.proxy, Object.assign({}, proxyConfigDefaults, {
		target: websocketTarget,
		ws: true
	}));
	middlewares.push(wsProxy);


	server.use(middlewares);
	server.on('upgrade', wsProxy.upgrade);
};