/*
 * 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 eagleControllers = angular.module('eagleControllers');

	// ======================================================================================
	// =                                        Alert                                       =
	// ======================================================================================
	eagleControllers.controller('alertListCtrl', function ($scope, $wrapState, PageConfig, CompatibleEntity, Time) {
		PageConfig.title = "Alerts";

		var originAlertList = [];
		$scope.alertList = [];
		$scope.siteFilter = '';
		$scope.loading = false;

		$scope.updateSiteFilter = function (siteId) {
			if (siteId !== undefined) $scope.siteFilter = siteId;

			if ($scope.siteFilter) {
				$scope.alertList = $.grep(originAlertList, function (alert) {
					return alert.tags.siteId === $scope.siteFilter;
				});
			} else {
				$scope.alertList = originAlertList;
			}
		};

		function loadAlerts() {
			$scope.loading = true;
			var list = CompatibleEntity.query("LIST", {
				query: "AlertService",
				startTime: new Time('startTime'),
				endTime: new Time('endTime')
			});
			list._then(function () {
				originAlertList = list;
				$scope.updateSiteFilter();
				$scope.loading = false;
			});
		}
		loadAlerts();

		Time.onReload(loadAlerts, $scope);
	});

	eagleControllers.controller('alertDetailCtrl', function ($sce, $scope, $wrapState, PageConfig, CompatibleEntity) {
		PageConfig.title = "Alert Detail";

		$scope.alertList = CompatibleEntity.query("LIST", {
			query: "AlertService",
			condition: { alertId: $wrapState.param.alertId }
		});
		$scope.alertList._then(function () {
			$scope.alert = $scope.alertList[0];

			if(!$scope.alert) {
				$.dialog({
					title: "OPS",
					content: "Alert '" + $wrapState.param.alertId + "' not found!"
				});
				return;
			}

			$scope.alertBody = $sce.trustAsHtml(($scope.alert.alertBody + "")
				.replace(/\\r/g, '\r')
				.replace(/\\n/g, '\n')
			);
		});
	});

	// ======================================================================================
	// =                                       Stream                                       =
	// ======================================================================================
	eagleControllers.controller('alertStreamListCtrl', function ($scope, $wrapState, PageConfig, Application, Entity) {
		PageConfig.title = "Streams";

		var originStreamList = [];
		$scope.streamList = [];
		$scope.siteFilter = '';

		$scope.updateSiteFilter = function (siteId) {
			if (siteId !== undefined) $scope.siteFilter = siteId;

			if ($scope.siteFilter) {
				$scope.streamList = $.grep(originStreamList, function (stream) {
					return stream.siteId === $scope.siteFilter;
				});
			} else {
				$scope.streamList = originStreamList;
			}
		};

		Entity.queryMetadata("streams")._then(function (res) {
			originStreamList = $.map(res.data, function (stream) {
				var application = Application.findProvider(stream.dataSource);
				return $.extend({application: application}, stream);
			});
			$scope.updateSiteFilter();
		});

		$scope.dataSources = {};
		Entity.queryMetadata("datasources")._then(function(res) {
			$.each(res.data, function (i, dataSource) {
				$scope.dataSources[dataSource.name] = dataSource;
			});
		});

		$scope.showDataSource = function (stream) {
			var dataSource = $scope.dataSources[stream.dataSource];
			$.dialog({
				title: dataSource.name,
				content: $("<pre class='text-break'>").html(JSON.stringify(dataSource, null, "\t")),
				size: "large"
			});
		};
	});

	// ======================================================================================
	// =                                       Policy                                       =
	// ======================================================================================
	eagleControllers.controller('policyListCtrl', function ($scope, $wrapState, PageConfig, Entity, Policy) {
		PageConfig.title = "Policies";
		$scope.loading = false;

		var originPolicyList = [];
		$scope.policyList = [];
		$scope.siteFilter = '';

		$scope.updateSiteFilter = function (siteId) {
			if (siteId !== undefined) $scope.siteFilter = siteId;

			if ($scope.siteFilter) {
				$scope.policyList = $.grep(originPolicyList, function (policy) {
					return policy.definition.siteId === $scope.siteFilter;
				});
			} else {
				$scope.policyList = originPolicyList;
			}
		};

		function updateList() {
			var list = Entity.queryMetadata("policies");
			$scope.loading = true;

			list._then(function () {
				$scope.loading = false;
				originPolicyList = list;
				$scope.updateSiteFilter();
			});
		}
		updateList();

		$scope.deletePolicy = function(policy) {
			Policy.delete(policy).then(updateList);
		};

		$scope.startPolicy = function(policy) {
			Policy.start(policy).then(updateList);
		};

		$scope.stopPolicy = function(policy) {
			Policy.stop(policy).then(updateList);
		};
	});

	eagleControllers.controller('policyDetailCtrl', function ($scope, $wrapState, $interval, PageConfig, Time, Entity, CompatibleEntity, Policy) {
		PageConfig.title = "Policy";
		PageConfig.subTitle = "Detail";
		PageConfig.navPath = [
			{title: "Policy List", path: "/policies"},
			{title: "Detail"}
		];

		$scope.tab = "setting";

		$scope.setTab = function (tab) {
			$scope.tab = tab;
		};

		function updatePolicy() {
			var policyName = $wrapState.param.name;
			var encodePolicyName = encodeURIComponent(policyName);
			var policyList = Entity.queryMetadata("policies/" + encodePolicyName);
			policyList._promise.then(function () {
				$scope.policy = policyList[0];
				console.log("[Policy]", $scope.policy);

				if(!$scope.policy) {
					$.dialog({
						title: "OPS",
						content: "Policy '" + $wrapState.param.name + "' not found!"
					}, function () {
						$wrapState.go("policyList");
					});
					return;
				}

				Entity.post("metadata/policies/parse", $scope.policy.definition.value)._then(function (res) {
					$scope.executionPlan = res.data;
				});
			});

			$scope.policyPublisherList = Entity.queryMetadata("policies/" + encodePolicyName + "/publishments/");

			Entity.queryMetadata("schedulestates")._then(function (res) {
				var schedule = res.data || {};
				$scope.assignment = common.array.find(policyName, schedule.assignments, ["policyName"]) || {};

				var queueList = $.map(schedule.monitoredStreams, function (stream) {
					return stream.queues;
				});
				$scope.queue = common.array.find($scope.assignment.queueId, queueList, ["queueId"]);
			});
		}
		updatePolicy();

		var streams = {};
		Entity.queryMetadata("datasources")._then(function(res) {
			var dataSources = {};
			$.each(res.data, function (i, dataSource) {
				dataSources[dataSource.name] = dataSource;
			});

			Entity.queryMetadata("streams")._then(function (res) {
				$.each(res.data, function (i, stream) {
					streams[stream.streamId] = stream;
					stream.dataSource = dataSources[stream.dataSource];
				});
			});
		});

		$scope.showDataSource = function (stream) {
			var dataSource = streams[stream].dataSource;
			$.dialog({
				title: dataSource.name,
				content: $("<pre class='text-break'>").html(JSON.stringify(dataSource, null, "\t")),
				size: "large"
			});
		};

		$scope.alertList = CompatibleEntity.query("LIST", {
			query: "AlertService",
			condition: {policyId: $wrapState.param.name},
			startTime: new Time().subtract(7, 'day'),
			endTime: new Time()
		});

		$scope.deletePolicy = function() {
			Policy.delete($scope.policy).then(function () {
				$wrapState.go("policyList");
			});
		};

		$scope.startPolicy = function() {
			Policy.start($scope.policy).then(updatePolicy);
		};

		$scope.stopPolicy = function() {
			Policy.stop($scope.policy).then(updatePolicy);
		};

		var refreshInterval = $interval($scope.alertList._refresh, 1000 * 60);
		$scope.$on('$destroy', function() {
			$interval.cancel(refreshInterval);
		});
	});
}());
