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

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

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

/**
 * Checks if a `solution` is enabled.
 *
 * When called as RF it returns false if the `solution` is not enabled, true if it is enabled.
 *
 * When used in a workflow script, it updates the ELO_WF_STATUS to either "SOLUTION_ENABLED" or "SOLUTION_DISABLED" (see {@link #DEFAULT_POSITIVE_STATUS} and {@link #DEFAULT_NEGATIV_STATUS}).
 *
 * @param
 * 
 * @author ESt, ELO Digital Office GmbH
 * @version 1.0
 *
 * @eloix
 * @requires sol.common.Template
 * @requires sol.common.RepoUtils
 * @requires sol.common.WfUtils
 * @requires sol.common.ix.RfUtils
 * @requires sol.common.ix.FunctionBase
 *
 */
sol.define("sol.common.ix.functions.CheckSolutionEnabled", {
  extend: "sol.common.ix.FunctionBase",

  requiredConfig: ["solution"],

  /** @cfg {String} solution (required)
   * module/package name of solution to be checked.
   */

  /**
   * @private
   * @property {String} [DEFAULT_POSITIVE_STATUS="SOLUTION_ENABLED"] Default workflow status in case of a successful check
   */
  DEFAULT_POSITIVE_STATUS: "SOLUTION_ENABLED",
  /**
   * @private
   * @property {String} [DEFAULT_NEGATIV_STATUS="SOLUTION_DISABLED"] Default workflow status in case of a successful check
   */
  DEFAULT_NEGATIV_STATUS: "SOLUTION_DISABLED",

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

  /**
   * Check, if solution is enabled.
   */
  process: function () {
    var me = this,
        enabled = me.checkSolutionEnabled(),
        startNode, status;

    if (me.wfDiagram) {
      startNode = sol.common.WfUtils.getNode(me.wfDiagram, 0);
      status = (enabled) ? me.DEFAULT_POSITIVE_STATUS : me.DEFAULT_NEGATIV_STATUS;

      startNode.yesNoCondition = status;
      me.logger.info(["changed ELO_WF_STATUS to '{0}' (flowId={1})", status, me.wfDiagram.id]);
    }

    return enabled;
  },

  /**
   * @private
   * Checks if `solution` is enabled by checking the existence of the solution folder inside the Business solutions folder.
   * @return {Boolean}
   */
  checkSolutionEnabled: function () {
    var me = this,
        repoUtils = sol.common.RepoUtils, modulePath, moduleObjId, solutionEnabled;
         
        
    if (typeof me.solution === "string" && me.solution.trim()) {
      modulePath = repoUtils.resolveSpecialFolder("{{bsFolderPath}}/" + me.solution.trim().toLowerCase()),
      moduleObjId = repoUtils.getObjId(modulePath),
      solutionEnabled = !!moduleObjId;
    } else {
      throw "solution parameter must be a non-empty string.";
    }

    me.logger.info(["check finished: {0} enabled={1};", me.solution, solutionEnabled]);

    return solutionEnabled;
  }

});


/**
 * @member sol.common.ix.functions.CheckSolutionEnabled
 * @static
 * @inheritdoc sol.common.ix.FunctionBase#onEnterNode
 */
function onEnterNode(clInfo, userId, wFDiagram, nodeId) {
  logger.enter("onEnterNode_CheckSolutionEnabled", { flowId: wFDiagram.id, nodeId: nodeId });
  var params = sol.common.WfUtils.parseAndCheckParams(wFDiagram, nodeId, "solution");  
  params.wfDiagram = wFDiagram;

  (sol.create("sol.common.ix.functions.CheckSolutionEnabled", params)).process();

  logger.exit("onEnterNode_CheckSolutionEnabled");
}

/**
 * @member sol.common.ix.functions.CheckSolutionEnabled
 * @static
 * @inheritdoc sol.common.ix.FunctionBase#onExitNode
 */
function onExitNode(clInfo, userId, wFDiagram, nodeId) {
  logger.enter("onExitNode_CheckSolutionEnabled", { flowId: wFDiagram.id, nodeId: nodeId });
  var params = sol.common.WfUtils.parseAndCheckParams(wFDiagram, nodeId, "solution");  
  params.wfDiagram = wFDiagram;

  (sol.create("sol.common.ix.functions.CheckSolutionEnabled", params)).process();

  logger.exit("onExitNode_CheckSolutionEnabled");
}

/**
 * @member sol.common.ix.functions.CheckSolutionEnabled
 * @method RF_sol_common_function_CheckSolutionEnabled
 * @static
 * @inheritdoc sol.common.ix.FunctionBase#RF_FunctionName
 */
function RF_sol_common_function_CheckSolutionEnabled(iXSEContext, args) {
  logger.enter("RF_sol_common_function_CheckSolutionEnabled", args);
  var params = sol.common.ix.RfUtils.parseAndCheckParams(iXSEContext, arguments.callee.name, args, "solution"),
      module = sol.create("sol.common.ix.functions.CheckSolutionEnabled", params);

  logger.exit("RF_sol_common_function_CheckSolutionEnabled");
  return sol.common.ix.RfUtils.stringify({ enabled: module.process() });
}