/*global async, d3*/

function toD3(results) {
	var model = {
		edgeSwitches: [],
		aggregationSwitches: [],
		coreSwitches: [],
		flows: [],
		controllers: results.controllers,
		activeControllers: results.activeControllers,
		links: results.links,
		configuration: results.configuration
	};

	// remove bad flows;
	results.flows.forEach(function (f) {
		if (f.dataPath && f.dataPath.flowEntries && f.dataPath.flowEntries.length > 1) {
			model.flows.push(f);
		}
	})

	// sort the switches
	results.switches.sort(function (a, b) {
		var aA = a.dpid.split(':');
		var bB = b.dpid.split(':');
		for (var i=0; i<aA.length; i+=1) {
			if (aA[i] != bB[i]) {
				return parseInt(aA[i], 16) - parseInt(bB[i], 16);
			}
		}
		return 0;
	});

	// identify switch types
	var coreSwitchDPIDs = {};
	results.configuration.core.forEach(function (dpid) {
		coreSwitchDPIDs[dpid] = true;
	});

	var aggregationSwitchDPIDs = {};
	results.configuration.aggregation.forEach(function (dpid) {
		aggregationSwitchDPIDs[dpid] = true;
	});

	results.switches.forEach(function (s) {
		var mapping = results.mapping[s.dpid]
		if (mapping) {
			s.controller = mapping[0].controllerId;
		}

		if (coreSwitchDPIDs[s.dpid]) {
			model.coreSwitches.push(s);
		} else if (aggregationSwitchDPIDs[s.dpid]) {
			model.aggregationSwitches.push(s);
		} else {
			model.edgeSwitches.push(s);
		}
	});

	return model;
}

var urls = {
	links: '/wm/onos/topology/links/json',
	switches: '/wm/onos/topology/switches/all/json',
	flows: '/wm/onos/flows/getsummary/0/0/json?proxy',
	activeControllers: '/wm/onos/registry/controllers/json',
	controllers: 'data/controllers.json',
	mapping: '/wm/onos/registry/switches/json',
	configuration: 'data/configuration.json'
}

var mockURLs = {
	links: 'data/wm_core_topology_links_json.json',
	switches: 'data/wm_core_topology_switches_all_json.json',
	flows: 'data/wm_flow_getall_json.json',
	activeControllers: 'data/wm_registry_controllers_json.json',
	controllers: 'data/controllers.json',
	mapping: 'data/wm_registry_switches_json.json',
	configuration: 'data/configuration.json'
}

var proxyURLs = {
	links: '/wm/onos/topology/links/json?proxy',
	switches: '/wm/onos/topology/switches/all/json?proxy',
	flows: '/wm/onos/flows/getsummary/0/0/json?proxy',
	activeControllers: '/wm/onos/registry/controllers/json?proxy',
	controllers: 'data/controllers.json',
	mapping: '/wm/onos/registry/switches/json?proxy',
	configuration: 'data/configuration.json'
}

var params = parseURLParameters();
if (params.mock) {
	urls = mockURLs;
}
if (params.proxy) {
	urls = proxyURLs;
}

var timeoutMS = 20000;

function makeRequest(key) {
	var url = urls[key];
	if (url) {
		return function (cb) {
			var timeout;
			var xhr = d3.json(url, function (error, result) {
				clearTimeout(timeout);

				if (error) {
					error = url + ' : ' + error.status;
				}

				if (cb) {
					cb(error, result);
				}
			});
			timeout = setTimeout(function () {
				xhr.abort();
				cb(url + ' timed out after ' + timeoutMS + ' ms');
				cb = null;
			}, timeoutMS);
		}
	} else {
		return function (cb) {
			cb(null, []);
		}
	}
}


function updateModel(cb) {
	async.parallel({
	    links: makeRequest('links'),
	    switches: makeRequest('switches'),
	    controllers: makeRequest('controllers'),
	    activeControllers: makeRequest('activeControllers'),
	    mapping: makeRequest('mapping'),
	    configuration: makeRequest('configuration'),
	    flows: makeRequest('flows')
	},
	function(err, results) {
		if (!err) {
			var model = toD3(results);
			cb(model);
		} else {
			console.log(JSON.stringify(err));
			cb(null);
		}
	});
}
