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

//@include lib_Class.js
//@include lib_sol.common.ix.FunctionBase.js
//@include lib_sol.common.ix.SubscriptionUtils.js

var logger = sol.create("sol.Logger", { scope: "sol.common.ix.functions.Subscription" });
/**
 * Provides functions for subscriptions.
 *
 * # As workflow node
 *
 * ObjId is set based on the element that the workflow is attached to.
 * Following configuration should be applied to the comments field.
 *
 * # As IX function call
 *
 *     sol.common.IxUtils.execute("RF_sol_function_Subscribe", {
 *       objId: "4711"
 *     });
 *
 * @author PZ, ELO Digital Office GmbH
 * @version 1.03.000
 *
 * @eloix
 * @requires sol.common.WfUtils
 * @requires sol.common.ix.RfUtils
 * @requires sol.common.ix.FunctionBase
 * @requires sol.common.ix.SubscriptionUtils
 */
sol.define("sol.common.ix.functions.Subscription", {
  extend: "sol.common.ix.FunctionBase",

  /**
   * @cfg {String} objId Either `objId` or `feedGuid` has to be defined.
   */

  /**
   * @cfg {String} feedGuid Either `objId` or `feedGuid` has to be defined.
   */

  /**
   * @cfg {Boolean} [subscribe=false] If `true` the user will subscribe to the element, if `false` the user will unsubscribe.
   */

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

  /**
   * Manages the subscription.
   */
  process: function () {
    var me = this;

    if (!me.objId && !me.feedGuid) {
      throw "IllegalStataException: either 'objId' or 'feedGuid' has to be defined";
    }

    if (me.subscribe === true) {
      me.feedGuid ? sol.common.ix.SubscriptionUtils.subscribe(me.feedGuid) : sol.common.ix.SubscriptionUtils.subscribeToElement(me.objId);
    } else {
      me.feedGuid ? sol.common.ix.SubscriptionUtils.unsubscribe(me.feedGuid) : sol.common.ix.SubscriptionUtils.unsubscribeFromElement(me.objId);
    }
  }

});


/**
 * @member sol.common.ix.functions.Subscription
 * @static
 * @inheritdoc sol.common.ix.FunctionBase#onEnterNode
 */
function onEnterNode(clInfo, userId, wFDiagram, nodeId) {
  var params, module;

  logger.enter("onEnterNode_Subscription", { flowId: wFDiagram.id, nodeId: nodeId });

  params = sol.common.WfUtils.parseAndCheckParams(wFDiagram, nodeId);
  params.objId = wFDiagram.objId;

  module = sol.create("sol.common.ix.functions.Subscription", params);
  module.process();

  logger.exit("onEnterNode_Subscription");
}

/**
 * @member sol.common.ix.functions.Subscription
 * @static
 * @inheritdoc sol.common.ix.FunctionBase#onExitNode
 */
function onExitNode(clInfo, userId, wFDiagram, nodeId) {
  var params, module;

  logger.enter("onExitNode_Subscription", { flowId: wFDiagram.id, nodeId: nodeId });

  params = sol.common.WfUtils.parseAndCheckParams(wFDiagram, nodeId);
  params.objId = wFDiagram.objId;

  module = sol.create("sol.common.ix.functions.Subscription", params);
  module.process();

  logger.exit("onExitNode_Subscription");
}

/**
 * @member sol.common.ix.functions.Subscription
 * @method RF_sol_function_Subscription
 * @static
 * @inheritdoc sol.common.ix.FunctionBase#RF_FunctionName
 */
function RF_sol_function_Subscription(ec, args) {
  var params, module;

  logger.enter("RF_sol_function_Subscription", args);

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

  module = sol.create("sol.common.ix.functions.Subscription", params);
  module.process();

  logger.exit("RF_sol_function_Subscription");

  return "{}"; // return empty JSON to avoid errors with older WF client libs
}