"use strict";

/**
 * Licensed Materials - Property of IBM
 * IBM Cognos Products: Cognos Analytics
 * Copyright IBM Corp. 2015, 2018
 * US Government Users Restricted Rights - Use, duplication or disclosure
 * restricted by GSA ADP Schedule Contract with IBM Corp.
 */
define(['underscore', 'doT', 'bi/admin/common/ui/MagicWand', 'bi/commons/ui/AccessibleView', 'bi/admin/common/ui/listview/ListView', 'bi/admin/nls/StringResource', 'text!bi/admin/multitenancy/templates/TenantsMemberListTemplate.html', 'bi/admin/common/utils/AJAXUtils', 'bi/commons/utils/BidiUtil', 'bi/commons/utils/ContentFormatter', 'bi/admin/multitenancy/services/TenantsListAdapter'], function (_, dot, MagicWand, View, ListView, StringResource, TenantsMemberListTemplate, AJAXUtils, BidiUtil, ContentFormatter, TenantsListAdapter) {
  'use strict'; //NOSONAR: meant to be strict

  var TenantsMemberList = View.extend({
    showBreadcrumbs: true,
    defaultTypes: ['tenant'],
    _breadCrumbs: null,
    listAdaptor: null,
    init: function init(options) {
      TenantsMemberList.inherited('init', this, arguments);
      this.glassContext = options.glassContext;
      this.listAdaptor = this._getNewTenantsListAdapter({
        glassContext: this.glassContext,
        objectInfo: this.objectInfo[0]
      });
      this.parent = options.parent;
      this.includeToolbar = options.includeToolbar ? options.includeToolbar : false;
      this.filterPushed = false;
      this.filterStringValue = {
        'tenant': true
      };
    },
    _getNewTenantsListAdapter: function _getNewTenantsListAdapter(options) {
      return new TenantsListAdapter(options);
    },
    _renderTemplate: function _renderTemplate() {
      var paneInfo = {
        'strings': {
          'title': StringResource.get('addTenantsTitle'),
          'type': StringResource.get('type'),
          'add': StringResource.get('add'),
          'close': StringResource.get('close')
        }
      };
      var sHtml = dot.template(TenantsMemberListTemplate)(paneInfo);
      this.$el.html(sHtml);
      BidiUtil.initElementForBidi(this.$el.find(".bi-admin-input.bi-admin-input-search")[0]);
    },
    _renderSearch: function _renderSearch() {
      return MagicWand.searchInput(this.$el).then(function (widgets) {
        if (widgets.length === 1) {
          this._searchInput = widgets[0];
          this._searchInput.options.hint = StringResource.get('filterTips');

          this._searchInput.on('changed', function (e) {
            var trimmed = e.text.trim();

            if (trimmed.length > 0 || e.text === '') {
              this.listView.setPaging(false);
              this.listView.filter(trimmed, 'defaultName');
            }
          }.bind(this));
        }
      }.bind(this));
    },
    _getNewListView: function _getNewListView(options) {
      return new ListView(options);
    },
    _renderListView: function _renderListView() {
      var elList = this.$el.find('.bi-admin-tenant-list');
      elList.empty();
      this.listView = this._getNewListView({
        el: elList,
        dataAdaptor: this.listAdaptor,
        glassContext: this.glassContext,
        accessibleLabel: this.title,
        activeInputForm: null,
        multiSelect: true,
        removeSelf: true,
        objectInfo: this.objectInfo[0]
      });
      this.listView.singleSelectCallback = this._rowClickHandler.bind(this);

      if (this.listAdaptor.contextMenuHandler) {
        this.listView.contextMenuCallback = this.listAdaptor.contextMenuHandler.bind(this.listAdaptor, this);
      }

      return this.listView.render();
    },
    render: function render() {
      this._renderTemplate();

      return this._renderSearch().then(this._renderListView.bind(this)).then(this._bindEvents.bind(this));
    },
    getSelectedObjects: function getSelectedObjects() {
      return this.listView.getSelectedObjects();
    },
    _getFilterBar: function _getFilterBar() {
      return this.$el.find(".bi-admin-filterbar.folderpane-filterbar");
    },
    _bindEvents: function _bindEvents() {
      var $filterButton = this.$el.find('#filterDef').on('primaryaction', function () {
        this._bindFilter();
      }.bind(this));
      var $label = $('<span class="bi-admin-filter-icon">');
      $label.text(this._filterString(this.filterStringValue));
      ContentFormatter.middleShortenString($label);
      $label.appendTo($filterButton);
      $('#btnAdd_addMembers').on('clicktap', function () {
        var selectedItems = this.getSelectedObjects();

        if (selectedItems.length === 0) {
          this.glassContext.appController.showToast(StringResource.get('memberSelErrorMsg'), {
            type: 'error'
          });
          return;
        }

        this._addMembers(selectedItems);
      }.bind(this));
      $('#btnCancel_addMembers').on('clicktap', function () {
        this.slideout.hide();
      }.bind(this));
    },
    _getUniqueMembers: function _getUniqueMembers(selectedMembers) {
      var existingMembers = this.objectInfo[0].tenantMembers ? this.objectInfo[0].tenantMembers : [];

      var formattedMembers = _.map(existingMembers, function (member) {
        return member.tenantID;
      });

      if (selectedMembers) {
        _.each(selectedMembers, function (val, index) {
          var found = _.find(existingMembers, function (member) {
            return val.tenantID === member.tenantID;
          });

          if (!found) {
            formattedMembers.push(val.tenantID);
          }
        });
      }

      return formattedMembers;
    },
    _addMembers: function _addMembers(selectedMembers) {
      var tenant = this.objectInfo[0];
      return this.listController.getTenant(tenant.tenantID).then(function (data) {
        this.objectInfo = data.data;
        var membersObj = {
          "tenantMembers": this._getUniqueMembers(selectedMembers)
        };
        return this.listController.addTenantMembers(tenant.tenantID, membersObj);
      }.bind(this)).then(function () {
        return this.listController.getTenant(tenant.tenantID);
      }.bind(this), function (ajaxOptions, err) {
        this.glassContext.appController.showErrorMessage(AJAXUtils.buildErrorMessage(err.responseJSON.errors), StringResource.get('failToAddMember'));
      }.bind(this)).then(function (data) {
        this.objectInfo = data.data;
        this.glassContext.appController.showToast(StringResource.get('addMemberMsg'));
        return this.parentView.refresh();
      }.bind(this));
    },
    setFocus: function setFocus() {
      this.$el.find('.bi-admin-filterbar-leading input').focus();
    },
    _filterString: function _filterString(filterString) {
      return filterString;
    },
    _filter: function _filter(filterStr) {
      if (this._searchInput) {
        this._searchInput.options.value = '';
      }

      var $label = this.$el.find('.bi-admin-filter-icon');

      if ($label) {
        $label[0].title = '';
      }

      var labelString = this._filterString(filterStr);

      $label.text(labelString);
      ContentFormatter.middleShortenString($label[0]);
      this.listAdaptor._filterType = filterStr || '';
      this.listAdaptor._filterString = '';
      this.listView.reload(false);
    },
    reloadList: function reloadList() {
      return this.listView.reload(false);
    },
    _rowClickHandler: function _rowClickHandler(oData) {
      if (this.listAdaptor.rowClickHandler) {
        this.listAdaptor.rowClickHandler(this, oData);
      }
    }
  });
  return TenantsMemberList;
});