var helper = require('./helper.js');
var async = require("async");

async function get_words_info(all_words, words_info) {
  var temp_added = []
  for (let all_words_key of Object.keys(all_words)) {
    for (let all_words_word of all_words[all_words_key]) {
      if (!temp_added.includes(all_words_word)) {
        temp_added.push(all_words_word);
        var temp_words_info = {
          "word": all_words_word,
          "text": "",
          "results": []
        }
        try {
          var url1 = "https://api.duckduckgo.com/?q={0}&format=json&pretty=1&no_html=1&skip_disambig=1".replace("{0}", all_words_word);
          var url2 = "https://api.duckduckgo.com/?q={0}&format=json&pretty=1".replace("{0}", all_words_word);
          var response1 = await helper.get_url_wrapper_json(url1);
          var response2 = await helper.get_url_wrapper_json(url2);
          if (response2.data != '') {
            if ("RelatedTopics" in response2.data) {
              if (response2.data.RelatedTopics.length > 0) {
                if (response2.data != '') {
                  if ("AbstractText" in response1.data && response1.data.AbstractText != "") {
                    temp_words_info.text = response1.data.AbstractText;
                  } else if ("Abstract" in response1.data && response1.data.AbstractText != "") {
                    temp_words_info.text = response1.data.Abstract;
                  } else {
                    temp_words_info.text = "unknown";
                  }
                }
                response2.data.RelatedTopics.forEach(function(item) {
                  if ("Name" in item) {
                    item.Topics.forEach(function(topic) {
                      temp_words_info.results.push({
                        "type": item.Name,
                        "text": topic.Text,
                        "url": topic.FirstURL
                      });
                    });
                  } else {
                    temp_words_info.results.push({
                      "type": "Related",
                      "text": item.Text,
                      "url": item.FirstURL
                    });
                  }
                });
              }
            }
          }

          if (temp_words_info.results.length > 0) {
            words_info.push(temp_words_info);
          }
        } catch (error) {
          helper.verbose && console.log(error);
        }
      }
    }
  }
}

async function check_engines(req, info) {
  try {
    if (helper.google_api_key == "" || helper.google_api_cs == "") {
      return
    }
    var url = "https://www.googleapis.com/customsearch/v1?key={0}&cx={1}&q={2}".replace("{0}", helper.google_api_key).replace("{1}", helper.google_api_cs).replace("{2}", req.body.string);
    var response = await helper.get_url_wrapper_json(url);
    if (response.data != '') {
      try {
        info.original = response.data.queries.request[0].searchTerms
      } catch (e) {}
      try {
        info.corrected = response.data.spelling.correctedQuery
      } catch (e) {}
      try {
        info.total = response.data.searchInformation.totalResults
      } catch (e) {}
      try {
        response.data.items.forEach(function(item) {
          info["items"].push({
            "title": item.title,
            "snippet": item.snippet
          });
        });
      } catch (e) {}
      try {
        if (info.total == 0 && info.corrected != "") {
          info.checking = info.original + " [Error]<br>Try this: " + info.corrected;
        } else if (info.total > 0 && info.corrected != "") {
          info.checking = info.original + " [Good]<br>Suggested word: " + info.corrected + "<br>Total lookups: " + info.total;
        } else if (info.total > 0 && info.corrected == "") {
          info.checking = info.original + " [Good]<br>Total lookups: " + info.total;
        } else {
          info.checking = "Using " + info.original + " with no lookups";
        }
      } catch (e) {}
    }
  } catch (error) {
    helper.verbose && console.log(error);
  }
}

async function custom_search_ouputs(req) {
  var possible_parameters = ['user', 'profile', 'account']
  const time = new Date();
  const functions = [];
  possible_parameters.forEach((key) => {
    functions.push(custom_search_ouputs_website.bind(null, req.body.uuid, req.body.string, key));
  });
  const results = await async.parallelLimit(functions, 6);
  helper.verbose && console.log(`Total time ${new Date() - time}`);
  var merged = [].concat.apply([], results.filter(item => item !== undefined));
  return merged
}

async function custom_search_ouputs_website(uuid, name, key) {

  return new Promise(async (resolve, reject) => {
    try {
      var results = []
      helper.log_to_file_queue(uuid, "[Custom Search Using] " + key)
      var url = "https://www.googleapis.com/customsearch/v1?key={0}&cx={1}&q={2}:{3}".replace("{0}", helper.google_api_key).replace("{1}", helper.google_api_cs).replace("{2}", key).replace("{3}", name);
      var response = await helper.get_url_wrapper_json(url);
      if (response.data != '') {
        if ('items' in response.data) {
          response.data.items.forEach((key) => {
            results.push({
              site: helper.get_site_from_url(key.link),
              link: key.link,
              snippet: key.snippet
            })
          });
        }
      }
      if (results.length > 0) {
        resolve(results);
      } else {
        resolve(undefined)
      }
    } catch (err) {
      resolve(undefined)
    }
  });
}

module.exports = {
  check_engines,
  get_words_info,
  custom_search_ouputs
}
