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

//@include lib_Class.js
//@include lib_sol.common.JsonUtils.js
//@include lib_sol.common.ix.RfUtils.js
//@include lib_sol.common.ix.ServiceBase.js
//@include lib_sol.common.HttpUtils.js
//@include lib_sol.common.Config.js
//@include lib_sol.common.Template.js

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

/**
 * Executes an ELO AS Business Solution action without the need of running an ELO AS instance in the DMZ.
 *
 * This service is useful if AS actions should be executed from web applications (e.g. ELO Web Client).
 *
 * # Configuration
 *
 * requires the solution name and rule name. A configuration object can be passed
 * as defined by the action. e.g.
 *
 *     sol.common.IxUtils.execute('RF_sol_common_service_ExecuteAsAction', {
 *       solution: 'pubsec',
 *       action: 'sol.pubsec.as.actions.CreateFilesReport',
 *       config: {
 *         templateId: templateId,
 *         fileId: fileId,
 *         targetId: targetId
 *       },
 *       connParams: {
 *         language: 'de'
 *       }
 *     }, function(data) {
 *        // process result
 *     }, function (err) {
 *        // error handling
 *     });
 *
 * In addition the client language should be passed. (connParams) This is required if localization information is processed by ELO AS.
 *
 * @author NM, ELO Digital Office GmbH
 * @version 1.0
 *
 * @eloix
 * @requires sol.common.JsonUtils
 * @requires sol.common.ix.RfUtils
 * @requires sol.common.ix.ServiceBase
 */
sol.define("sol.common.ix.services.ExecuteAsAction", {
  extend: "sol.common.ix.ServiceBase",

  requiredConfig: ["action", "config"],

  /**
   * @cfg {String} solution
   * Name of the solution, which the as rule is part of.
   * This is used for handling several elo as configurations.
   */
  solution: "common",

   /**
    * @cfg {String} action
    * Name of the action that should be called. Usually the name of the ELO AS rule.
    */

    /**
     * @cfg {Object} config
     * Configuration for the action as defined by the action.
     */

    /**
     * @cfg {Object} connParams (optional)
     * Configuration of the current connection. This includes localization information.
     *
     *     {
     *	     language: 'en'
     *     }
     */

  /**
   * @private
   * @property {String} eloAsUrlTemplate
   */
  eloAsUrlTemplate: "{{asCfg.protocol}}://{{asCfg.serverName}}:{{asCfg.port}}/{{asCfg.serviceName}}/as?cmd=get&name={{action.rule}}&param2={{action.config}}&param3={{connParams}}&ticket={{ticket}}",

  initialize: function (config) {
    var me = this;
    me.$super("sol.common.ix.ServiceBase", "initialize", [config]);
  },

  getRuleConfig: function (config) {
    var tplData, strConfig;
    strConfig = sol.common.JsonUtils.stringifyAll(config);
    tplData = JSON.parse(strConfig);
    
    if (tplData.$templating) {
      tplData.type = tplData.$templating.$type;
      tplData.tree = tplData.$templating.$tree;
      tplData.preconditions = tplData.$templating.$preconditions;
    }

    return (sol.create("sol.common.Template", { source: strConfig })).apply(tplData);
  },

  /**
   * Executes an ELO AS Business Solution action without the need of running an ELO AS instance in the DMZ
   * @return {Object}
   */
  process: function () {
    var me = this,
        asCfg, asUrlTpl, asUrl, result;

    asCfg = sol.create("sol.common.Config").loadEloAsConfig(me.solution || "common");

    if (!me.connParams) {
      me.connParams = {};
    }

    asUrlTpl = sol.create("sol.common.Template", { source: me.eloAsUrlTemplate });
    asUrl = asUrlTpl.apply({
      ticket: me.ci.ticket,
      asCfg: asCfg,
      action: {
        rule: encodeURIComponent(me.action),
        config: encodeURIComponent(me.getRuleConfig(me.config))
      },
      connParams: encodeURIComponent(sol.common.JsonUtils.stringifyAll(me.connParams))
    });
    
    if (me.objId) {
    	asUrl += "&param1=" + me.objId;
    }

    logger.info("Executing ELO AS action.", asUrl);

    result = sol.common.HttpUtils.sendGet(asUrl, {
      connectTimeout: 30000,
      readTimeout: 30000,
      contentType: "application/json;charset=UTF-8"
    });

    if (result.responseOk === false) {
      throw result.errorMessage;
    }

    return result;
  }

});

/**
 * @member sol.common.ix.services.ExecuteAsAction
 * @method RF_sol_common_service_ExecuteAsAction
 * @static
 * @inheritdoc sol.common.ix.ServiceBase#RF_ServiceBaseName
 */
function RF_sol_common_service_ExecuteAsAction(ec, configAny) {
  var config, module, result;

  logger.enter("RF_sol_common_service_ExecuteAsAction", configAny);

  config = sol.common.ix.RfUtils.parseAndCheckParams(ec, arguments.callee.name, configAny, "action", "config");
  config.ci = ec.ci;

  module = sol.create("sol.common.ix.services.ExecuteAsAction", config);
  result = sol.common.JsonUtils.stringifyAll(module.process());

  logger.exit("RF_sol_common_service_ExecuteAsAction", result);
  return result;
}