/**
 * Delete a Cloudant index:
 * https://docs.cloudant.com/cloudant_query.html#deleting-an-index
 **/

var DESIGN_PREFIX = '_design/';

function main(message) {
  var cloudantOrError = getCloudantAccount(message);
  if (typeof cloudantOrError !== 'object') {
    return Promise.reject(cloudantOrError);
  }
  var cloudant = cloudantOrError;
  var dbName = message.dbname;
  var docId = message.docid;
  var indexName = message.indexname;
  var indexType = message.indextype;

  if(!dbName) {
    return Promise.reject('dbname is required.');
  }
  if(!docId) {
    return Promise.reject('docid is required.');
  }
  if(!indexName) {
    return Promise.reject('indexname is required.');
  }
  if(!indexType) {
    return Promise.reject('indextype is required.');
  }

  return deleteIndexFromDesignDoc(cloudant, docId, indexName, indexType, dbName);
}

function deleteIndexFromDesignDoc(cloudant, docId, indexName, indexType, dbName) {

  return new Promise(function(resolve, reject) {
    var path = "_index/" + encodeURIComponent(docId)
      + '/' + encodeURIComponent(indexType)
      + '/' + encodeURIComponent(indexName);

    cloudant.request({ db: encodeURIComponent(dbName),
        method : 'delete',
        path : path
      }, function(error, response) {
      if (!error) {
        console.log('success', response);
        resolve(response);
      } else {
        console.log('error', error);
        reject(error);
      }
    });

  });
}

function getCloudantAccount(message) {
  // full cloudant URL - Cloudant NPM package has issues creating valid URLs
  // when the username contains dashes (common in Bluemix scenarios)
  var cloudantUrl;

  if (message.url) {
    // use bluemix binding
    cloudantUrl = message.url;
  } else {
    if (!message.host) {
      return 'cloudant account host is required.';
    }
    if (!message.username) {
      return 'cloudant account username is required.';
    }
    if (!message.password) {
      return 'cloudant account password is required.';
    }

    cloudantUrl = "https://" + message.username + ":" + message.password + "@" + message.host;
  }

  return require('cloudant')({
    url: cloudantUrl
  });
}
