Source: query.es6

'use strict';
import $ from 'jquery';
import Config from './config.es6'


//TODO: Cache ALL queries for N-time in local storage based on path/params key

/** Class for wrapping jquery request in a promise based on the specified endpoint. */
class Query {
  /**
   * Run a jQuery ajax.get with the configured host for the specified path with given params.
   * Runs
   * @param path {string} - Required. The endpoint for the ajax query
   * @param {Hash} params - Optional. Hash of params to pass to the get call
   * @param {success} function - Optional. function to call with response object from successful call. If not present, just returns the repsonse object value.
   * @param {failure} function - Optional. function to call with the error object from a failed call. If not present, logs the error and returns the error object value.
   * @return {jQueryPromise} A promise that either returns the response/error or calls the passed callbacks.
   */
  static get(path, params, success, failure) {
    console.log("RT3 Query:", Config.rootPath + path, params);
    return $.ajax({
      url: Config.rootPath + path,
      method: 'GET',
      data: params
    }).then((response)=>{
        if (success) {
          success(response);
        } else {
          return(response);
        }
      }, (error)=>{
        if  (failure) {
          failure(error);
        } else {
          if (console) {
            console.error(error);
          }
          return(error);
        }
    });
  }

  /**
   * Run a jQuery ajax.get with the configured host for jsonp call.
   * Runs
   * @param path {string} - Required. The endpoint for the jsonp service
   * @param {Hash} params - Optional. Hash of params to pass to the get call
   * @param {Hash} jsonCallback - jsonpCallback function
   * @param {success} function - Optional. function to call with response object from successful call. If not present, just returns the repsonse object value.
   * @param {failure} function - Optional. function to call with the error object from a failed call. If not present, logs the error and returns the error object value.
   * @return {jQueryPromise} A promise that either returns the response/error or calls the passed callbacks.
   */
  static getJson(path, params, jsonCallback = 'jsonCallback', success, failure) {

    let cb = function(arg) {
      return arg;
    }

    return $.ajax({
      url:  path,
      method: 'GET',
      data: params,
      cache: true,
      dataType: 'jsonp',
      jsonpCallback: jsonCallback,
      contentType: 'application/json'
    }).then((response)=>{
        if (success) {
          success(response);
        } else {
          return(response);
        }
      }, (jqXHR, textStatus, errorThrown)=>{
        if  (failure) {
          failure(jqXHR);
        } else {
          if (console) {
            console.error('Error: ', jqXHR, textStatus, errorThrown);
          }
          return(jqXHR);
        }
    });
  }
}

export default Query;