"use strict";

/**
 * Licensed Materials - Property of IBM
 * IBM Cognos Products: admin
 * Copyright IBM Corp. 2018
 * US Government Users Restricted Rights -Use, duplication or disclosure
 * restricted by GSA ADP Schedule Contract with IBM Corp.
 */
define(['underscore', 'bi/admin/common/services/BaseCustomizationService', 'bi/admin/common/utils/AJAXUtils', 'bi/admin/nls/StringResource'], function (_, BaseCustomizationService, AJAXUtils, StringResource) {
  'use strict'; //NOSONAR: meant to be strict

  var TenantsCustomizationService = BaseCustomizationService.extend({
    getCustomizations: function getCustomizations(id) {
      return this._getCustomizations(AJAXUtils.getPath("tenantCustomizations", id));
    },
    saveCustomizations: function saveCustomizations(id) {
      return Promise.try(function () {
        return this._saveCustomizations(AJAXUtils.getPath("tenantCustomizations", id));
      }.bind(this));
    },
    _saveCustomizations: function _saveCustomizations(url) {
      if (this._customizations.fileUpload_location === ".my_folders") {
        delete this._customizations.fileUpload_location;
        url = url + "&fields=fileUpload_location";
        return this._ajaxDelete(url, 'DELETE');
      }

      if (this._customizations.ui_teamFolders && _.isEmpty(this._customizations.ui_teamFolders)) {
        delete this._customizations.ui_teamFolders;
        url = url + "&fields=ui_teamFolders";
        return this._ajaxDelete(url, 'DELETE');
      }

      return this._ajaxPut(url, this._customizations);
    },
    _getCustomizationsWithDefaults: function _getCustomizationsWithDefaults() {
      var returnValue = {
        'ui_theme': StringResource.get('default'),
        'ui_homePage': {
          'perspective': StringResource.get('default')
        },
        'ui_excludedFeatures': {
          'ids': []
        },
        'ui_teamFolders': {},
        'parameters': {},
        'contentLocale': "",
        'productLocale': "",
        'timeZoneID': "",
        'baseTextDirection': "",
        'biDirectionalFeaturesEnabled': false,
        'fileUpload_location': null
      };

      if (this._customizations) {
        Object.keys(returnValue).forEach(this._replaceDefaultsWCustomValues.bind(this, returnValue, this._customizations));
      }

      return returnValue;
    },
    getTenant: function getTenant(id) {
      return this._ajaxGet(AJAXUtils.getPath("getTenant", id) + "&fields=defaultName,disabled,permissions,owner.defaultName,hidden,capabilities,hasChildren,searchPath,modificationTime,creationTime,ancestors,defaultDescription,tenantID,tenantMembers,id");
    },
    getTenantIDForUser: function getTenantIDForUser(userID) {
      return this._ajaxGet(AJAXUtils.getPath("tenantIDForUser", userID) + "?fields=tenantID");
    },
    _getTenants: function _getTenants() {
      return this._ajaxGet(AJAXUtils.getPath("tenants") + "?fields=defaultName,disabled,modificationTime,permissions,tenantID,storeID"); //return this._ajaxGet('v1/search/cm?filter=type|tenant');
    },
    getTenantsList: function getTenantsList() {
      return this._getTenants().then(function (tenants) {
        return tenants.data;
      }.bind(this));
    },
    addTenant: function addTenant(tenantSpec) {
      return this._ajaxPost(AJAXUtils.getPath("tenants"), tenantSpec);
    },
    updateTenant: function updateTenant(id, tenantSpec) {
      return this._ajaxPut(AJAXUtils.getPath("updateTenant", id), tenantSpec);
    },
    addTenantMembers: function addTenantMembers(id, tenantMembers) {
      return this.updateTenant(id, tenantMembers);
    },
    removeTenantMembers: function removeTenantMembers(id, tenantMembers) {
      return this.updateTenant(id, tenantMembers);
    },
    disableTenant: function disableTenant(id, tenantSpec) {
      return this.updateTenant(id, {
        'disabled': tenantSpec
      });
    },
    deleteTenant: function deleteTenant(id, shouldDeleteTenantUserProfile) {
      if (!shouldDeleteTenantUserProfile) {
        return this._ajaxDelete(AJAXUtils.getPath("deleteTenant", id));
      } else {
        return this._ajaxDelete(AJAXUtils.getPath("deleteTenantUserProfile", id));
      }
    },
    killTenantSessions: function killTenantSessions(id) {
      return this._ajaxDelete(AJAXUtils.getPath("killTenantSessions", id));
    },
    getTenantNotificationSettings: function getTenantNotificationSettings(id) {
      return this._fetchGet(AJAXUtils.getPath("tenantNotificationSettings", id));
    },
    setTenantNotificationSettings: function setTenantNotificationSettings(id, senderEmail) {
      return this._fetchPut(AJAXUtils.getPath("tenantNotificationSettings", id), {
        "defaultSender": senderEmail
      });
    },
    getSystemNotificationSettings: function getSystemNotificationSettings() {
      return this._fetchGet(AJAXUtils.getPath("systemNotificationSettings"));
    },
    getTenantPreferences: function getTenantPreferences(id) {
      return this._fetchGet(AJAXUtils.getPath("tenantPreferences", id));
    },
    setTenantPreferences: function setTenantPreferences(id, preferences) {
      return this._fetchPut(AJAXUtils.getPath("tenantPreferences", id), preferences);
    }
  });
  return TenantsCustomizationService;
});