/**
 * Passes inputs to https://fuzzy.ai
 *
 * @param {string} input The Fuzzy.ai Agent input name
 * @param {number} value The value to pass.
 * @customfunction
 */
function FUZZYAI(input) {
  var inputs = {};

  var docProperties = PropertiesService.getDocumentProperties();

  var apiKey = docProperties.getProperty('FUZZYAI_API_KEY');
  var agentID = docProperties.getProperty('FUZZYAI_AGENT_ID');

  if (!apiKey || apiKey == "" || !agentID || agentID == "") {
    return "Settings required. See Fuzzy.ai > Settings";
  }

  for (var i = 0; i < arguments.length; i += 2) {
    inputs[arguments[i]] = arguments[i+1];
  }
  if (inputs["version"]) {
    delete inputs["version"];
  }
  var payload = JSON.stringify(inputs);
  var headers = {
    'Authorization': 'Bearer ' + apiKey,
    'Content-type': 'application/json'
  };
  var url = 'https://api.fuzzy.ai/agent/' + agentID;
  var options = {
    'method': 'post',
    'headers': headers,
    'payload': payload
  };
  var response = UrlFetchApp.fetch(url, options);
  if (response.getResponseCode() != 200) {
    throw new Error("Error using the fuzzy.ai API");
  }
  var outputs = JSON.parse(response.getContentText("UTF-8"));
  var results = [[]];
  for (var output in outputs) {
    results[0].push(outputs[output]);
  }
  return results;
}

/**
 * Deprecated use FUZZYAI instead.
 *
 * @customfunction
 */
function FUZZIFY(input) {
  return FUZZYAI.apply(this, arguments);
}

// onInstall function
function onInstall(e) {
  onOpen(e);
}

// Add custom menu option
function onOpen(e) {
  SpreadsheetApp.getUi()
      .createAddonMenu()
      .addItem('Settings', 'showSettingsDialog')
      .addToUi();
}

// Loads Settings.html as a template and populates existing values
function getSettings() {
  var docProperties = PropertiesService.getDocumentProperties();

  t = HtmlService.createTemplateFromFile('Settings');

  t.apiKey = docProperties.getProperty('FUZZYAI_API_KEY');
  t.agentID = docProperties.getProperty('FUZZYAI_AGENT_ID');

  return t.evaluate();
}

// Show settings dialog from template above.
function showSettingsDialog() {
  var html = getSettings();

  html.setWidth(400);
  html.setHeight(300);

  SpreadsheetApp.getUi()
      .showModalDialog(html, 'Fuzzy.ai Settings');
}

// Save handler for settings form.
function saveSettings(formObject) {
  var docProperties = PropertiesService.getDocumentProperties();
  docProperties.setProperty('FUZZYAI_API_KEY', formObject.apiKey);
  docProperties.setProperty('FUZZYAI_AGENT_ID', formObject.agentID);
}