/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

(function() {
	'use strict';

	var featureControllers = angular.module('featureControllers');
	var feature = featureControllers.register("userProfile");

	// ==============================================================
	// =                          Function                          =
	// ==============================================================

	// ==============================================================
	// =                        User Profile                        =
	// ==============================================================

	// ======================== Profile List ========================
	//feature.navItem("list", "User Profiles", "graduation-cap");
	feature.controller('list', function(PageConfig, Site, $scope, $interval, Entities) {
		PageConfig.pageSubTitle = Site.current().tags.site;

		$scope.common = common;
		$scope.algorithms = [];

		// ======================================== Algorithms ========================================
		$scope.algorithmEntity = {};
		Entities.queryEntities("AlertDefinitionService", {site: Site.current().tags.site, dataSource: "userProfile"})._promise.then(function(data) {
			$scope.algorithmEntity = common.getValueByPath(data, "obj[0]");
			$scope.algorithmEntity.policy = common.parseJSON($scope.algorithmEntity.policyDef);
		});

		// ======================================= User profile =======================================
		$scope.profileList = Entities.queryEntities("MLModelService", {site: Site.current().tags.site}, ["user", "algorithm", "content", "version"]);
		$scope.profileList._promise.then(function() {
			var _algorithms = {};
			var _users = {};

			// Map user
			$.each($scope.profileList, function(i, unit) {
				_algorithms[unit.tags.algorithm] = unit.tags.algorithm;
				var _user = _users[unit.tags.user] = _users[unit.tags.user] || {user: unit.tags.user};
				_user[unit.tags.algorithm] = {
					version: unit.version
				};

				// DE
				if(unit.tags.algorithm === "DE") {
					var _statistics = common.parseJSON(unit.content);
					_statistics = common.getValueByPath(_statistics, "statistics", []);
					_user[unit.tags.algorithm].topCommands = $.map(common.array.top(_statistics, "mean"), function(command) {
						return command.commandName;
					});
				}
			});

			// Map algorithms
			$scope.algorithms = $.map(_algorithms, function(algorithm) {
				return algorithm;
			}).sort();

			$scope.profileList.splice(0);
			$scope.profileList.push.apply($scope.profileList, common.map.toArray(_users));
		});

		// =========================================== Task ===========================================
		$scope.tasks = [];
		function _loadTasks() {
			var _tasks = Entities.queryEntities("ScheduleTaskService", {
				site: Site.current().tags.site,
				_pageSize: 100,
				_duration: 1000 * 60 * 60 * 24 * 14,
				__ETD: 1000 * 60 * 60 * 24
			});
			_tasks._promise.then(function() {
				$scope.tasks.splice(0);
				$scope.tasks.push.apply($scope.tasks, _tasks);

				// Duration
				$.each($scope.tasks, function(i, data) {
					if(data.timestamp && data.updateTime) {
						var _ms = (new moment(data.updateTime)).diff(new moment(data.timestamp));
						var _d = moment.duration(_ms);
						data._duration = Math.floor(_d.asHours()) + moment.utc(_ms).format(":mm:ss");
						data.duration = _ms;
					} else {
						data._duration = "--";
					}
				});
			});
		}

		$scope.runningTaskCount = function () {
			return common.array.count($scope.tasks, "INITIALIZED", "status") +
				common.array.count($scope.tasks, "PENDING", "status") +
				common.array.count($scope.tasks, "EXECUTING", "status");
		};

		// Create task
		$scope.updateTask = function() {
			$.dialog({
				title: "Confirm",
				content: "Do you want to update now?",
				confirm: true
			}, function(ret) {
				if(!ret) return;

				var _entity = {
					status: "INITIALIZED",
					detail: "Newly created command",
					tags: {
						site: Site.current().tags.site,
						type: "USER_PROFILE_TRAINING"
					},
					timestamp: +new Date()
				};
				Entities.updateEntity("ScheduleTaskService", _entity, {timestamp: false})._promise.success(function(data) {
					if(!Entities.dialog(data)) {
						_loadTasks();
					}
				});
			});
		};

		// Show detail
		$scope.showTaskDetail = function(task) {
			var _content = $("<pre>").text(task.detail);

			var $mdl = $.dialog({
				title: "Detail",
				content: _content
			});

			_content.click(function(e) {
				if(!e.ctrlKey) return;

				$.dialog({
					title: "Confirm",
					content: "Remove this task?",
					confirm: true
				}, function(ret) {
					if(!ret) return;

					$mdl.modal('hide');
					Entities.deleteEntity("ScheduleTaskService", task)._promise.then(function() {
						_loadTasks();
					});
				});
			});
		};

		_loadTasks();
		var _loadInterval = $interval(_loadTasks, app.time.refreshInterval);
		$scope.$on('$destroy',function(){
			$interval.cancel(_loadInterval);
		});
	});

	// ======================= Profile Detail =======================
	feature.controller('detail', function(PageConfig, Site, $scope, $wrapState, Entities) {
		PageConfig.pageTitle = "User Profile";
		PageConfig.pageSubTitle = Site.current().tags.site;
		PageConfig
			.addNavPath("User Profile", "/userProfile/list")
			.addNavPath("Detail");

		$scope.user = $wrapState.param.filter;

		// User profile
		$scope.profiles = {};
		$scope.profileList = Entities.queryEntities("MLModelService", {site: Site.current().tags.site, user: $scope.user});
		$scope.profileList._promise.then(function() {
			$.each($scope.profileList, function(i, unit) {
				unit._content = common.parseJSON(unit.content);
				$scope.profiles[unit.tags.algorithm] = unit;
			});

			// DE
			if($scope.profiles.DE) {
				console.log($scope.profiles.DE);

				$scope.profiles.DE._chart = {};

				$scope.profiles.DE.estimates = {};
				$.each($scope.profiles.DE._content, function(key, value) {
					if(key !== "statistics") {
						$scope.profiles.DE.estimates[key] = value;
					}
				});

				var _meanList = [];
				var _stddevList = [];

				$.each($scope.profiles.DE._content.statistics, function(i, unit) {
					_meanList[i] = {
						x: unit.commandName,
						y: unit.mean
					};
					_stddevList[i] = {
						x: unit.commandName,
						y: unit.stddev
					};
				});
				$scope.profiles.DE._chart.series = [
					{
						key: "mean",
						values: _meanList
					},
					{
						key: "stddev",
						values: _stddevList
					}
				];

				// Percentage table list
				$scope.profiles.DE.meanList = [];
				var _total = common.array.sum($scope.profiles.DE._content.statistics, "mean");
				$.each($scope.profiles.DE._content.statistics, function(i, unit) {
					$scope.profiles.DE.meanList.push({
						command: unit.commandName,
						percentage: unit.mean / _total
					});
				});
			}

			// EigenDecomposition
			if($scope.profiles.EigenDecomposition && $scope.profiles.EigenDecomposition._content.principalComponents) {
				$scope.profiles.EigenDecomposition._chart = {
					series: [],
				};

				$.each($scope.profiles.EigenDecomposition._content.principalComponents, function(z, grp) {
					var _line = [];
					$.each(grp, function(x, y) {
						_line.push([x,y,z]);
					});

					$scope.profiles.EigenDecomposition._chart.series.push({
						data: _line
					});
				});
			}
		});

		// UI
		$scope.showRawData = function(content) {
			$.dialog({
				title: "Raw Data",
				content: $("<pre>").text(content)
			});
		};
	});
})();