'use strict';
// Контроллер страниц шаблонов заказов
app.controller('ordersController', ['$scope', '$timeout', '$interval', '$q', 'config', 'ordersService', 'contentService', 'ngAudio',
function ($scope, $timeout, $interval, $q, config, ordersService, contentService, ngAudio) {
	
	var images, fullscreenImages, refreshImageTimer, hasError, splashOrderTimer,
		hideSplashOrderTimer, splashOrders = [], orderCompleteSound,
		currentPage = 0, changePageTimer, ordersRefreshingIsInProgress;

	// Вывод текущего времени
	function refreshTime() {
		$scope.time = new Date();
	}

	// Вывод заказов
	function refreshOrders() {
		if (ordersRefreshingIsInProgress) {
			return;
		}
        ordersRefreshingIsInProgress = true;
		ordersService.getOrders()
			.then(function (orders) {
				$scope.orders = orders;

				// Запускаем смену рекламных изображений если:
				if (hasError // была ошибка;
					|| !$scope.fullscreenImage && !$scope.image // изображения ещё не загружались;
					|| $scope.fullscreenImage && orders.length // изображение во весь экран нужно сменить на пол-экрана;
					|| !$scope.fullscreenImage && !orders.length) { // изображение на пол-экрана нужно сменить на весь экран.
					hasError = false;
					refreshImage();
				}

				ordersService.updateSplashOrders(splashOrders, orders);
				if (!angular.isDefined(splashOrderTimer)) {
					showSplash();
				}
				if (!angular.isDefined(changePageTimer)) {
					initPaging();
				}
                ordersRefreshingIsInProgress = false;
			}, function (error) {
				showError(error);
                ordersRefreshingIsInProgress = false;
			});
	}

	// Смена рекламного изображения
	function refreshImage() {
		if (hasError) {
			return;
		}
		var isFullscreenMode = $scope.orders && !$scope.orders.length;
		if (isFullscreenMode) {
			$scope.image = null;
			$scope.fullscreenImage = contentService.getNextImage(fullscreenImages, $scope.fullscreenImage);
			playMedia($scope.fullscreenImage);
		} else {
			$scope.fullscreenImage = null;
			$scope.image = contentService.getNextImage(images, $scope.image);
			playMedia($scope.image);
		}
	}

	// Проверить, что медиафайл является видео
	function isVideo(fileName) {
		return fileName && fileName.indexOf('.mp4') >= 0;
	}

	// Воспроизвести медиафайл
	function playMedia(media) {
		stopMedia();
		if (isVideo(media)) {
			$timeout(function () {
                var videoControls = document.getElementsByClassName('video');
                if (videoControls.length) {
                    videoControls[0].onended = refreshImage;
                    videoControls[0].load();
                    videoControls[0].play();
                }
			}, 100);
		} else {
			refreshImageTimer = $timeout(refreshImage, +config.imageChangeTimeout * 1000);
		}
	}

	// Остановить воспроизведение медиафайла
	function stopMedia() {
		$timeout.cancel(refreshImageTimer);
		var videoControls = document.getElementsByClassName('video');
		if (videoControls.length) {
			videoControls[0].pause();
		}
	}

	// Загрузить контент
	function loadContent() {
		$q.all([contentService.getImages(), contentService.getFullscreenImages()])
		.then(function (imgs) {
			images = imgs[0];
			fullscreenImages = imgs[1];
		});
		if (contentService.orderCompleteSound) {
			orderCompleteSound = ngAudio.load(contentService.orderCompleteSound);
		}
	}

	// Показать всплывающее окно с приготовленным заказом
	function showSplash() {
		$scope.splashOrder = ordersService.getSplashOrder(splashOrders);
		$scope.visibleSplashOrder = !!$scope.splashOrder;
		if ($scope.splashOrder) {
			playSound();
			hideSplashOrderTimer = $interval(hideSplash, +config.splashShowTimeout * 1000, 1);
			if (!angular.isDefined(splashOrderTimer)) {
				splashOrderTimer = $interval(showSplash, +config.splashChangeTimeout * 1000);
			}
		} else if (angular.isDefined(splashOrderTimer)) {
			$interval.cancel(splashOrderTimer);
			splashOrderTimer = undefined;
		}
	}
	
	// Скрыть всплывающее окно с приготовленным заказом
	function hideSplash() {
		$scope.visibleSplashOrder = false;
		if (angular.isDefined(hideSplashOrderTimer)) {
			$interval.cancel(hideSplashOrderTimer);
			hideSplashOrderTimer = undefined;
		}
	}

	// Воспроизвести звук приготовления заказа
	function playSound () {
		if (!orderCompleteSound) return;
		
		if (orderCompleteSound.paused !== false) {
			orderCompleteSound.play();
		} else {
			orderCompleteSound.progress = 0;
		}
	}

	// Отобразить ошибку
	function showError(err) {
		hasError = true;
		stopMedia();
		if (err && err.licenseLimitError) {
			$scope.fullscreenImage = contentService.licenseLimitImage;
		}
		else {
			$scope.fullscreenImage = contentService.notResponseImage;
		}
	}

	// Инициализация смены страниц заказов
	function initPaging() {
		if (config.paging && config.paging.timeout && config.paging.pageSize) {
			$scope.pageSize = +config.paging.pageSize;
			changePageTimer = $interval(changePage, +config.paging.timeout * 1000);
			changePage();
		}
	}

	// Смена страницы заказов
	function changePage() {
		if (!$scope.orders || !$scope.orders.length) {
			$scope.ordersPage = [];
		}
		if (currentPage >= $scope.orders.length / $scope.pageSize) {
			currentPage = 0;
		}
		$scope.ordersPage = $scope.orders.slice(currentPage * $scope.pageSize, (currentPage + 1) * $scope.pageSize);
		currentPage++;
	}

	$scope.completeStatusImage = contentService.completeStatusImage;
	$scope.logoImage = contentService.logoImage;
	$scope.backgroundImage = contentService.backgroundImage;
	var refreshTimeTimer = $interval(refreshTime, 1000);
	var refreshOrdersTimer = $interval(refreshOrders, +config.ordersRefreshTimeout * 1000);
	var clearConsoleTimer = $interval(console.clear(), 5 * 60 * 1000);
	refreshTime();
	refreshOrders();
	loadContent();

	// Уничтожение всех таймеров при уничтожении страницы
	$scope.$on("$destroy", function (event) {
		$interval.cancel(refreshTimeTimer);
		$interval.cancel(refreshOrdersTimer);
		$interval.cancel(refreshImageTimer);
		$interval.cancel(clearConsoleTimer);
		if (splashOrderTimer) {
			$interval.cancel(splashOrderTimer);
		}
		if (hideSplashOrderTimer) {
			$interval.cancel(hideSplashOrderTimer);
		}
		if (changePageTimer) {
			$interval.cancel(changePageTimer);
		}
	});
	$scope.isVideo = isVideo;
}]);
