text: /*
   * 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.
   */
  
  define(function(require){
      'use strict';
  
  	var Backbone		= require('backbone');
  	var App				= require('App');
  	var XAUtil			= require('utils/XAUtils');
  	var XAEnums			= require('utils/XAEnums');
  	var XALinks 		= require('modules/XALinks');
  	var UploadservicepolicyTmpl = require('hbs!tmpl/common/uploadservicepolicy_tmpl');
  	
  	var ServiceMappingItem = Backbone.Marionette.ItemView.extend({
  		_msvName : 'ServiceMappingItem',
  		template : require('hbs!tmpl/common/ServiceMappingItem'),
  		ui : { 
  			sourceInput : 'input[data-id="source"]',
  			destinationSelect : '[data-id="destination"]',
  			deleteMap : 'a[data-id="delete"]',
  			'overrridCheck'	: 'input[data-name="override"]:checked',
  		},
  		events : function(){
  			var events = {};
  			events['change ' + this.ui.sourceInput]	= 'onSourceChange';
  			events['change ' + this.ui.destinationSelect]	= 'onDestinationSelect';
  			events['click ' + this.ui.deleteMap]	= 'onDeleteMapClick';
  			return events;
  		},
  
  		initialize : function(options) {
  			_.extend(this, _.pick(options, 'collection','serviceNames','services'));
  			
  		},
  		onSourceChange : function(e){
  			var sourceValue = e.currentTarget.value.trim();
  			this.model.set('source', _.isEmpty(sourceValue) ? undefined : sourceValue);
  		},
  		onDestinationSelect : function(e) {
  		   this.model.set('destination', _.isEmpty(e.currentTarget.value) ? undefined : e.currentTarget.value);
  		   var serviceTypes = _.find( this.services.models , function(m){
  			   return m.get('name') == e.currentTarget.value
  		   });
  		   if(!_.isUndefined(serviceTypes)){
  			   this.model.set('serviceType' , serviceTypes.get('type') );
  		   }else{
  			   this.model.set('serviceType' , " " );
  		   }
  		},
  		onDeleteMapClick : function(){
  			this.collection.remove(this.model)	
  		},
   
  		onRender : function() {
  			var that = this;
  			var options = _.map(this.serviceNames, function(m, key){ return { 'id' : m.name, 'text' : m.name}; });
  			this.ui.sourceInput.val(this.model.get('source'));
  			this.ui.destinationSelect.val(this.model.get('destination'));
  			this.ui.destinationSelect.select2({
  				closeOnSelect: true,
  				placeholder: 'Select service name',
  			    width: '220px',
  			    allowClear: true,
  			    data:options,
  			});
  		}
  	});
  	
  	var UploadServicePolicy = Backbone.Marionette.CompositeView.extend({
  		
  		template : UploadservicepolicyTmpl,
  		templateHelpers : function(){
  			return { 'serviceType' : this.serviceType };
  		},
  		getItemView : function(item){
  			if(!item){
  				return;
  			}
  			return ServiceMappingItem;
  		},
  		itemViewContainer : ".js-serviceMappingItems",
  		itemViewOptions : function() {
  			return {
  				'collection' 	: this.collection,
  				'serviceNames' 	: this.serviceNames,
  				'services': this.services,
  			};
  		},
  		initialize: function(options) {
  		  this.bind("ok", this.okClicked);
  		  _.extend(this, _.pick(options, 'collection','serviceNames','serviceDefList','serviceType','services'));
  		  this.componentServices = this.services.where({'type' : this.serviceType })
  		  this.serviceNames =this.componentServices.map(function(m){ return { 'name' : m.get('name') } });
  		},
  		ui:{
  			'importFilePolicy'  : '[data-id="uploadPolicyFile"]',
  			'addServiceMaping'	: '[data-id="addServiceMaping"]',
  			'componentType'		: '[data-id="componentType"]',
  			'fileNameClosebtn' 	: '[data-id="fileNameClosebtn"]'
  		},
  		events: function() {
  			var events = {};
  			events['change ' + this.ui.importFilePolicy] = 'importPolicy';
  			events['click ' + this.ui.addServiceMaping] = 'onAddClick';
  			events['click ' + this.ui.fileNameClosebtn]	= 'fileNameClosebtn';
  			return events;
  		},
  		okClicked: function (modal) {
  			if( _.isUndefined(this.targetFileObj) || (_.isEmpty(this.ui.componentType.val()) && this.ui.componentType.is(":visible"))){
  				if(_.isUndefined(this.targetFileObj)){
  					this.$el.find('.selectFileValidationMsg').show();
  				}else{
  					this.$el.find('.selectFileValidationMsg').hide();
  				}
  				if (_.isEmpty(this.ui.componentType.val())){
  					this.$el.find('.seviceFiledValidationFile').show();
  				}else{
  					this.$el.find('.seviceFiledValidationFile').hide();
  				}
  				return modal.preventClose();
  			}
  			var that = this, serviceMapping = {}, fileObj = this.targetFileObj, preventModal = false , url ="";
  			if(this.$el.find('input[data-name="override"]').is(':checked')){
          	    url = "service/plugins/policies/importPoliciesFromFile?isOverride=true";
  			}else{
          	    url = "service/plugins/policies/importPoliciesFromFile?isOverride=false";
  			}
  			this.collection.each(function(m){
  				if( m.get('source') !== undefined && m.get('destination') == undefined 
  						|| m.get('source') == undefined && m.get('destination') !== undefined ){
  					that.$el.find('.serviceMapErrorMsg').show();
  					that.$el.find('.serviceMapTextError').hide();
  					preventModal = true;
  				}
  				if(!_.isUndefined(m.get('source'))){
  					serviceMapping[m.get('source')] = m.get('destination') 
  				}
  			});
  			if(preventModal){
  				modal.preventClose();
  				return;
  			}
  			if(this.collection.length>1){
  				that.collection.models.some(function(m){
  					   if (!_.isEmpty(m.attributes)) {
  	                        if (m.has('source') && m.get('source') != '') {
  	                            var model = that.collection.where({
  	                                'source': m.get('source')
  	                            });
  	                            if (model.length > 1) {
  	                            	that.$el.find('.serviceMapTextError').show();
  	                            	that.$el.find('.serviceMapErrorMsg').hide();
  	                            	preventModal = true;
  	                                return true;
  	                            }
  	                        }
  					   }
  				})
  			}
  			if(preventModal){
  				modal.preventClose();
  				return;
  			}
  			this.formData = new FormData();
  	        this.formData.append('file', fileObj);
  	        if(!_.isEmpty(serviceMapping)){ 
  	        	this.formData.append('servicesMapJson', new Blob([JSON.stringify(serviceMapping)],{type:'application/json'}));
  	        }
  		var compString = ''
  	        if(!_.isUndefined(that.serviceType)){
  	        	compString=that.serviceType
  	        }else{
  	        	compString = this.ui.componentType.val()
  	        }
  	        XAUtil.blockUI();
  		   	$.ajax({
  		        type: 'POST',
  		        url: url+"&serviceType="+compString,
  		        enctype: 'multipart/form-data',
  		        data: this.formData,
  		        cache: false,
  		        dataType:'Json',
  		        contentType: false,
  		        processData: false,
  		        success: function () {
  		        	XAUtil.blockUI('unblock');
  		        	var msg =  'File import successfully.' ;
  					XAUtil.notifySuccess('Success', msg);
  	
  		        },
  		   	      error : function(response,model){
  		   	    	XAUtil.blockUI('unblock');
  		   	 	if ( response && response.responseJSON && response.responseJSON.msgDesc){
  					XAUtil.notifyError('Error', response.responseJSON.msgDesc);
  			        } else {
  			       	XAUtil.notifyError('Error', 'File import failed.');
  		     	    }
  				  }
  		    });
  	    },
  	    onAddClick : function(){
  	    	this.collection.add(new Backbone.Model());
  	    },
  	 	onRender: function() {
  	 		this.$el.find('.fileValidation').hide();
          	this.$el.find('.selectFileValidationMsg').hide();
          	if(this.serviceType==undefined){
  			   this.$el.find('.seviceFiled').show();
  			   this.renderComponentSelect();
          	}else{
  			   this.$el.find('.seviceFiled').hide();
          	}
  		},
  		/* add 'component' and 'policy type' select */
  		renderComponentSelect: function(){
  			var that = this;
  			var options = this.serviceDefList.map(function(m){ return { 'id' : m.get('name'), 'text' : m.get('name')}; });
  			var optionVal = options.map(function(m){return m.text})
              this.ui.componentType.val(optionVal);
  			this.ui.componentType.select2({
  				multiple: true,
  				closeOnSelect: true,
  				placeholder: 'Select Component',
  			    width: '530px',
  			    allowClear: true,
  			    data: options
  			}).on('change', function(e){
  				var selectedComp  = e.currentTarget.value, componentServices = [];
  				_.each(selectedComp.split(","), function(type){
  					var services = that.services.where({'type' : type });
  					componentServices = componentServices.concat(services);
  				});
  				var names = componentServices.map(function(m){ return { 'name' : m.get('name') } });
  				that.serviceNames = names;
  				if(!_.isUndefined(e.removed)){
  					_.each(that.collection.models , function(m){
  						if(m.get('serviceType') == e.removed.id){
  							var mapModels = that.collection.filter(function(m){
  								return m.get('serviceType') == e.removed.id;
  							})
  							if(!_.isUndefined(mapModels)){
  								that.collection.remove(mapModels);
  							}
  						}
  					});
  				}
  				that.collection.trigger('reset');
  			}).trigger('change');
  		},
  		importPolicy : function(e){
  			var that =this;
  			console.log("uploading....");
  			this.$el.find('.selectFile').hide(); 
  			this.$el.find('.selectFileValidationMsg').hide(); 
  			this.$el.find('.fileValidation').hide();
  			this.targetFileObj = e.target.files[0];
  			if(!_.isUndefined(this.targetFileObj)){
  				this.$el.find('.selectFile').html('<i>'+this.targetFileObj.name+'</i><label class="icon icon-remove icon-1x icon-remove-btn" data-id="fileNameClosebtn"></label>').show()
  			}else{
  				this.$el.find('.selectFile').html("No file chosen").show();
  			}
  		},
  		fileNameClosebtn : function(){
              this.$el.find('.selectFile').hide()
  	     	this.$el.find('.selectFile').html("No file chosen").show()
  			this.$el.find('.fileValidation').hide();
  			this.$el.find('.selectFileValidationMsg').hide();
  			this.targetFileObj = undefined;
  			this.ui.importFilePolicy.val('');
   		}
  		
  	});
  	return UploadServicePolicy; 
  });
  