/*
 * 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("metadata");

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

	// ==============================================================
	// =                          Metadata                          =
	// ==============================================================

	// ======================= Policy Summary =======================
	feature.navItem("streamList", "Metadata", "bullseye");
	feature.controller('streamList', function(PageConfig, Site, $scope, $q, Application, Entities) {
		PageConfig.hideSite = true;

		$scope.streams = {};
		$scope._streamEntity = null;
		$scope._streamEntityLock = false;

		// =========================================== List ===========================================
		var _streamList = Entities.queryEntities("AlertStreamService", {dataSource: Application.current().tags.application});
		var _streamSchemaList = Entities.queryEntities("AlertStreamSchemaService", {dataSource: Application.current().tags.application});
		$scope.streamList = _streamList;
		$scope.streamSchemaList = _streamSchemaList;

		_streamList._promise.then(function() {
			$.each(_streamList, function(i, stream) {
				stream.metaList = [];
				$scope.streams[stream.tags.dataSource + "_" + stream.tags.streamName] = stream;
			});
		});

		$q.all([_streamList._promise, _streamSchemaList._promise]).then(function() {
			$.each(_streamSchemaList, function(i, meta) {
				var _stream = $scope.streams[meta.tags.dataSource + "_" + meta.tags.streamName];
				if(_stream) {
					_stream.metaList.push(meta);
				} else {
					console.warn("[Meta] Stream not match:", meta.tags.dataSource + "_" + meta.tags.streamName);
				}
			});
		});
	});
})();