(function () {
	let savedErrors = [], timeout;

	/**
	 * @param {ErrorEvent} event
	 */
	function handleEvent(event) {
		savedErrors.push(event);
		if (event.cancelable) {
			event.preventDefault();
			event.stopImmediatePropagation();
		}
		sendReports();
	}

	/**
	 * @param {ErrorEvent} event
	 */
	function sendReport(event) {
		let message = {
			message: event.message,
			file: event.filename,
			line: event.lineno,
			column: event.colno,
			url: document.location.href,
			error: event.error || null
		};

		$.ajax(
			{
				type: 'POST',
				url: '/error/reporterror',
				contentType: 'application/json',
				data: JSON.stringify(message)
			}
		);
	}

	function sendReports() {
		let pending = 0;

		if (typeof $ === 'undefined') {
			console.info('Deferred reporting of error');
			timeout = window.setTimeout(sendReports, 1000);
			return;
		}

		pending = savedErrors.length;

		if (pending > 0) {
			console.info('Sending ' + pending + ' reports');
			while (savedErrors.length > 0) {
				sendReport(savedErrors.shift());
			}
		}
	}

	if (document.location.host.indexOf('local') === -1) {
		window.addEventListener(
			'error',
			handleEvent
		);
	}

	window.BundleSites = window.BundleSites || {};
	window.BundleSites.reportError = function (msg) {
		handleEvent(new ErrorEvent('error', new Error(msg)));
	};
})();


