importPackage(Packages.de.elo.ix.client);

//@include lib_Class.js
//@include lib_decimal-light.js
//@include lib_sol.common.Cache.js
//@include lib_sol.common.Config.js
//@include lib_sol.common.JsonUtils.js
//@include lib_sol.common.HttpUtils.js
//@include lib_sol.common.ix.RfUtils.js
//@include lib_sol.common_fx.ix.FxUtils.js

var logger = sol.create("sol.Logger", { scope: "sol.common_fx.ix.services.ForeignExchangeRates" });

/**
 * @class sol.common_fx.ix.services.ForeignExchangeRates
 * @extends sol.common.ix.FunctionBase
 * Functions for loading exchange rates or convert amounts.
 *
 * # Load exchange rates
 * Loads the exchange rates from an external service and updates the database if persist is true.
 *
 *     sol.common.IxUtils.execute('RF_sol_common_fx_service_LoadExchangeRates', {
 *       persist: true
 *     });
 *
 * Result object:
 *
 *     {
 *       "USD": "1.1389",
 *       "JPY": "136.33",
 *       "BGN": "1.9558",
 *       ...
 *     }
 *
 * # Convert currencies
 * Converts an amount from one currency to another.
 * 'to' parameter is optional, if it's empty, the base currency will be used.
 *
 *     sol.common.IxUtils.execute('RF_sol_common_fx_service_ConvertCurrencies', {
 *       amount: "47.11",
 *       from: "USD",
 *       to: "GBP"
 *     });
 *
 * Result object:
 *
 *     {
 *       amount: "47.11",
 *       from: "USD",
 *       to: "GBP",
 *       result: "30.0719"
 *     }
 * 
 * # Get exchange rate by code and date
 * Gets historical exchange rate from database. Searches for the closest date in the past, 
 * followed by the nearest date in the future or returns current date if none is found
 * 
 *
 *     sol.common.IxUtils.execute('RF_sol_common_fx_service_getExchangeRateByCodeAndDate', {
 *       currencyCode: "AUD",
 *       isoDate: "20220118000000"
 *     });
 * 
 * Result object:
 *
 *     {
 *       exchangeRate: 1.5811
 *     }
 *
 * @author PZ, ELO Digital Office GmbH
 * @version 1.0
 *
 * @requires  sol.common.JsonUtils
 * @requires  sol.common.ix.RfUtils
 * @requires  sol.common_fx.ix.FxUtils
 *
 */

/**
 * @member sol.common_fx.ix.services.ForeignExchangeRates
 * @method RF_sol_common_fx_service_LoadExchangeRates
 * @static
 * @inheritdoc sol.common.ix.FunctionBase#RF_FunctionName
 */
function RF_sol_common_fx_service_LoadExchangeRates(ec, jsonParams) {
  logger.enter("RF_sol_common_fx_service_LoadExchangeRates", jsonParams);
  var params, result, errorMsg;

  params = sol.common.ix.RfUtils.parseAndCheckParams(ec, arguments.callee.name, jsonParams, "persist");

  logger.info("load exchange rates");

  try {
    result = sol.common_fx.ix.FxUtils.loadExchangeRates(params.persist);
  } catch (e) {
    errorMsg = "error loading exchange rates: " + e;
    logger.warn(errorMsg);
    result = result || {};
    result.error = errorMsg;
  }
  result = sol.common.ix.RfUtils.stringify(result);
  logger.exit("RF_sol_common_fx_service_LoadExchangeRates", result);
  return result;
}

/**
 * @member sol.common_fx.ix.services.ForeignExchangeRates
 * @method RF_sol_common_fx_service_ConvertCurrencies
 * @static
 * @inheritdoc sol.common.ix.FunctionBase#RF_FunctionName
 */
function RF_sol_common_fx_service_ConvertCurrencies(ec, jsonParams) {
  logger.enter("RF_sol_common_fx_service_ConvertCurrencies", jsonParams);

  var result = {},
      params, errorMsg;

  params = sol.common.ix.RfUtils.parseAndCheckParams(ec, arguments.callee.name, jsonParams, "amount", "from");

  logger.info("convert amount");

  try {
    result = sol.common_fx.ix.FxUtils.convertAmount(params.amount, params.from, params.to);
  } catch (e) {
    errorMsg = "error converting amount: " + e;
    logger.error(errorMsg);
    result = result || {};
    result.error = errorMsg;
  }
  result = sol.common.ix.RfUtils.stringify(result);
  logger.exit("RF_sol_common_fx_service_ConvertCurrencies", result);
  return result;
}

/**
 * @member sol.common_fx.ix.services.ForeignExchangeRates
 * @method RF_sol_common_fx_service_getExchangeRateByCodeAndDate
 * @static
 * @inheritdoc sol.common.ix.FunctionBase#RF_FunctionName
 */
function RF_sol_common_fx_service_getExchangeRateByCodeAndDate(ec, jsonParams) {
  logger.enter("RF_sol_common_fx_service_getExchangeRateByCodeAndDate", jsonParams);
  var params, result, errorMsg;

  params = sol.common.ix.RfUtils.parseAndCheckParams(ec, arguments.callee.name, jsonParams, "currencyCode", "isoDate");

  logger.info("finding historical exchange rate");

  try {
    result = sol.common_fx.ix.FxUtils.getExchangeRateByCodeAndDate(params.currencyCode, params.isoDate);
  } catch (e) {
    errorMsg = "error finding historical exchange rate: " + e;
    logger.warn(errorMsg);
    result = result || {};
    result.error = errorMsg;
  }
  result = sol.common.ix.RfUtils.stringify(result);
  logger.exit("RF_sol_common_fx_service_getExchangeRateByCodeAndDate", result);
  return result;
}