"use strict";

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

  var ConnectionListController = Class.extend({
    /**
     * constructor
     */
    init: function init(options) {
      ConnectionListController.inherited('init', this, arguments);
      this.glassContext = options.glassContext;
    },
    _formatConnectionEntry: function _formatConnectionEntry(conn) {
      var writable = conn.permissions && conn.permissions.indexOf('write') > -1 ? true : false;
      return {
        id: conn.id,
        connId: conn.id,
        title: conn.defaultName,
        defaultName: conn.defaultName,
        defaultDescription: conn.defaultDescription,
        connectionString: conn.connectionString,
        modificationTime: conn.modificationTime,
        credentialNamespaces: conn.credentialNamespaces,
        apiToken: conn.apiToken,
        disabled: conn.disabled,
        hidden: conn.hidden,
        searchPath: conn.searchPath,
        writable: writable,
        creationTime: conn.creationTime,
        permissions: conn.permissions,
        gatewayDestination: conn.gatewayDestination,
        secureKey: conn.secureKey,
        type: conn.type,
        tenantID: conn.tenantID,
        owner: conn.owner
      };
    },
    _getConnections: function _getConnections(id) {
      var options = {
        method: 'GET',
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
      };
      options.url = AJAXUtils.getAJAXURL('datasources') + '/' + id + '/connections?' + encodeURIComponent('fields') + '=' + encodeURIComponent('defaultName,disabled,permissions,owner.defaultName,hidden,capabilities,hasChildren,modificationTime,creationTime,ancestors,defaultDescription,connectionString,tenantID');
      return this.glassContext.services.ajax.ajax(options);
    },
    _getConnection: function _getConnection(dsID, connID) {
      var options = {
        method: 'GET',
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
      };
      options.url = AJAXUtils.getAJAXURL('datasources') + '/' + dsID + '/connections/' + connID + '?' + encodeURIComponent('fields') + '=' + encodeURIComponent('defaultName,disabled,permissions,owner.defaultName,hidden,capabilities,hasChildren,searchPath,modificationTime,creationTime,apiToken,credentialNamespaces,ancestors,defaultDescription,connectionString,tenantID,gatewayDestination{id,parent},secureKey');
      return this.glassContext.services.ajax.ajax(options);
    },
    getConnection: function getConnection(dsID, connID) {
      return new Promise(function (resolve, reject) {
        this._getConnection(dsID, connID).then(function (data) {
          resolve(this._formatConnectionEntry(data));
        }.bind(this), reject);
      }.bind(this));
    },
    deleteConnection: function deleteConnection(connId, datasourceId) {
      var options = {
        method: 'DELETE',
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
      };
      options.url = AJAXUtils.getAJAXURL('datasources') + '/' + datasourceId + '/connections/' + connId;
      return this.glassContext.services.ajax.ajax(options);
    },
    getConnectionList: function getConnectionList(id) {
      return new Promise(function (resolve, reject) {
        this._getConnections(id).then(function (connection) {
          var sortedConns = _.sortBy(connection.data, 'defaultName');

          var items = _.map(sortedConns, this._formatConnectionEntry.bind(this), function () {
            this.glassContext.services.logger.error('Could not map connections');
          }.bind(this));

          resolve(items);
        }.bind(this), reject);
      }.bind(this));
    }
  });
  return ConnectionListController;
});