/* global __karma__ */

'use strict';

import utils from './utils';

function readFile(url, callback) {
	var request = new XMLHttpRequest();
	request.onreadystatechange = function() {
		if (request.readyState === 4) {
			return callback(request.responseText);
		}
	};

	request.open('GET', url, false);
	request.send(null);
}

function loadConfig(url, callback) {
	var regex = /\.(json|js)$/i;
	var matches = url.match(regex);
	var type = matches ? matches[1] : 'json';
	var cfg = null;

	readFile(url, function(content) {
		switch (type) {
		case 'js':
			// eslint-disable-next-line
			cfg = new Function('"use strict"; var module = {};' + content + '; return module.exports;')();
			break;
		case 'json':
			cfg = JSON.parse(content);
			break;
		default:
		}

		callback(cfg);
	});
}

function specFromFixture(description, inputs) {
	var input = inputs.js || inputs.json;
	it(input, function(done) {
		loadConfig(input, function(json) {
			var descr = json.description || (json.description = description);
			var chart = utils.acquireChart(json.config, json.options);
			if (!inputs.png) {
				fail(descr + '\r\nMissing PNG comparison file for ' + input);
				done();
			}

			utils.readImageData(inputs.png, function(expected) {
				expect(chart).toEqualImageData(expected, json);
				utils.releaseChart(chart);
				done();
			});
		});
	});
}

function specsFromFixtures(path) {
	var regex = new RegExp('(^/base/test/fixtures/' + path + '.+)\\.(png|json|js)');
	var inputs = {};

	Object.keys(__karma__.files || {}).forEach(function(file) {
		var matches = file.match(regex);
		var name = matches && matches[1];
		var type = matches && matches[2];

		if (name && type) {
			inputs[name] = inputs[name] || {};
			inputs[name][type] = file;
		}
	});

	return function() {
		Object.keys(inputs).forEach(function(key) {
			specFromFixture(key, inputs[key]);
		});
	};
}

export default {
	specs: specsFromFixtures
};
