/*
 * 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 XAEnums         = require('utils/XAEnums');
    var XAUtil          = require('utils/XAUtils');
    var localization    = require('utils/XALangSupport');
    var VXGroup         = require('models/VXGroup');
    var VXGroupList         = require('collections/VXGroupList');
    var VXUserList          = require('collections/VXUserList');
    require('bootstrap-editable');

    var UsersAndGroupsItem = Backbone.Marionette.ItemView.extend({
        _msvName : 'FormInputItem',

        template : require('hbs!tmpl/users/AddUserOrGroupsItem_tmpl'),

        tagName : 'tr',

        templateHelpers : function(){
            var usersGroupsName = this.model.get('name');
            return {
                usersGroupsName : usersGroupsName,
            };
        },

        ui : {
            'isRoleAdmin' : 'input[data-js="isRoleAdmin"]',
        },

        events : {
            'click [data-action="delete"]'  : 'evDelete',
            'click [data-js="isRoleAdmin"]' : 'evClickTD',
        },

        initialize : function(options) {
            _.extend(this, _.pick(options, 'collection', 'fieldName'));
        },

        onRender : function() {
            var that = this;
            this.ui.isRoleAdmin.attr('checked', this.model.get('isAdmin'));
        },

        evClickTD : function(e){
            var $el = $(e.currentTarget);
            this.model.set('isAdmin', $el.is(':checked'));
        },

        evDelete : function(){
            var that = this;
            this.collection.remove(this.model);
        },
    });

    var AddUserOrGroupsList =  Backbone.Marionette.CompositeView.extend({

        _msvName : 'AddUserOrGroupsList',

        template : require('hbs!tmpl/users/AddUserOrGroupsList_tmpl'),

        templateHelpers :function(){
            var headerName = this.fieldName === 'users' ? "User Name" : this.fieldName === 'groups' ? "Group Name" : "Role Name",
            btnLable = this.fieldName === 'users' ? 'Add Users' : this.fieldName === 'groups' ? "Add Group" : "Add Role";
            return {
                headerName : headerName,
                btnLable : btnLable
            };
        },

        getItemView : function(item){
            if(!item){
                return;
            }
            return UsersAndGroupsItem;
        },
        itemViewContainer : ".js-formInput",

        itemViewOptions : function() {
            return {
                'collection' : this.collection,
                'fieldName'  : this.fieldName,
            };
        },

        ui : {
            'selectUsersOrGroups' : '[data-js="selectUsersOrGroups"]',
            'addUserGroupRoleBtn' : '[data-action="addUserGroup"]'
        },

        events : {
            'click [data-action="addUserGroup"]' : 'addNew'
        },

        /** all events binding here */
        bindEvents : function() {
        },

        initialize : function(options) {
            _.extend(this, _.pick(options, 'collection', 'fieldName', 'model'));
        },

        onRender : function() {
            if(this.collection.length === 0){
                this.$el.find('[data-id="userGroupsTable"]').html('<tr data-name="'+this.fieldName+'"><td colspan="3"> No '
                    +this.fieldName+' found</td></tr>');
            }
            this.ui.selectUsersOrGroups.select2(XAUtil.getUsersGroupsList(this.fieldName, this));
            this.ui.selectUsersOrGroups.attr("data-name", this.fieldName+"Select");
            this.ui.addUserGroupRoleBtn.attr("data-name", this.fieldName+"AddBtn")
        },

        addNew : function() {
            var that =this;
            this.$('table').show();
            if(_.isEmpty(this.ui.selectUsersOrGroups.val())) {
                XAUtil.alertPopup ({
                    msg: 'Please select '+this.fieldName
                });
                return
            } else {
                this.$el.find('[data-name='+this.fieldName+']').hide();
                _.each(this.ui.selectUsersOrGroups.val().split(','), function(name){
                    that.collection.add(new Backbone.Model({'name' : name , 'isAdmin' : false}));
                });
                this.ui.selectUsersOrGroups.select2('data',[]);
            }
        },
    });

    return AddUserOrGroupsList;

});
