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

//@include lib_Class.js
//@include lib_sol.common.Config.js
//@include lib_sol.common.JsonUtils.js
//@include lib_sol.common.SordUtils.js
//@include lib_sol.common.IxUtils.js
//@include lib_sol.common.WfUtils.js
//@include lib_sol.common.CounterUtils.js
//@include lib_sol.common.AclUtils.js
//@include lib_sol.common.RepoUtils.js
//@include lib_sol.common.Template.js
//@include lib_sol.common.TranslateTerms.js
//@include lib_sol.common.ix.RfUtils.js
//@include lib_sol.common.ix.ActionBase.js
//@include lib_sol.common.ix.FunctionBase.js
//@include lib_sol.common.ExceptionUtils.js
//@include lib_sol.dev.ix.ActionUtils.js

var logger = sol.create("sol.Logger", { scope: "sol.dev.ix.actions.Deploy" });

/**
 * Deploys / Undeploys a package.
 *
 * @eloix
 * @requires sol.common.Config
 * @requires sol.common.JsonUtils
 * @requires sol.common.SordUtils
 * @requires sol.common.IxUtils
 * @requires sol.common.CounterUtils
 * @requires sol.common.AclUtils
 * @requires sol.common.RepoUtils
 * @requires sol.common.Template
 * @requires sol.common.TranslateTerms
 * @requires sol.common.WfUtils
 * @requires sol.common.ix.RfUtils
 * @requires sol.common.ix.ActionBase
 * @requires sol.common.ix.FunctionBase
 * @requires sol.common.ix.functions.CopyFolderContents
 * @requires sol.common.ix.functions.CopySordData
 * @requires sol.common.ActionUtils
 */
sol.define("sol.dev.ix.actions.Deploy", {
  extend: "sol.common.ix.ActionBase",

  requiredConfig: ["ci", "user", "objId", "mode"],

  /**
   * @cfg {de.elo.ix.client.ClientInfo} ci (required)
   */

  /**
   * @cfg {de.elo.ix.client.UserInfo} user (required)
   */

  /**
   * @cfg {String} objId (required)
   * Object ID of the selected package
   */

  /**
   * @cfg {String} mode (required)
   * Deploy or undeploy selected package
   */

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

  getName: function () {
    return "Deploy";
  },

  process: function () {
    var me = this,
        name, flowId, wfTemplate, sord;

    if ((!me.objId) || (!me.isPackage(me.objId))) {
      if (me.mode == "deploy") {
        me.addErrorEvent("sol.dev.ix.actions.Deploy.error.target", null, null, me.ci);
      } else {
        me.addErrorEvent("sol.dev.ix.actions.Undeploy.error.target", null, null, me.ci);
      }
      return;
    }

    if (me.mode == "undeploy") {
      sord = sol.common.RepoUtils.getSord(me.objId);
      if (sord.name.indexOf("undeployed") > -1) {
        me.addErrorEvent("sol.dev.ix.actions.Undeploy.error.target", null, null, me.ci);
        return;
      }
    }

    name = me.buildElementName(me.mode);
    wfTemplate = me.getWfTemplate(me.mode);
    flowId = me.startWorkflow(me.objId, wfTemplate, name);

    if (flowId) {
      me.addWfDialogEvent(flowId, { objId: me.objId, title: name, dialogId: me.getName() });
      me.addRefreshEvent(me.objId);
    }
  },

  isPackage: function (objId) {
    var sord;

    sord = sol.common.RepoUtils.getSord(objId);
    return sol.common.SordUtils.hasDocMask(sord, "ELO Business Solution");
  },

  /**
   * @private
   * @param {String} mode
   * @return {String}
   */
  getWfTemplate: function (mode) {
    var me = this,
        wfTemplate;

    switch (mode) {
      case "deploy":
        wfTemplate = me.config.workflows.Deploy.workflowTemplateName;
        break;
      case "undeploy":
        wfTemplate = me.config.workflows.Undeploy.workflowTemplateName;
        break;
      default:
        wfTemplate = me.config.workflows.Deploy.workflowTemplateName;
    }
    return wfTemplate;
  },

  /**
   * @private
   * @return {Object}
   */
  buildElementName: function (mode) {
    var me = this,
        prefix, wfName;

    switch (mode) {
      case "deploy":
        prefix = me.getLocalizedString(me.ci, me.config.workflows.Deploy.workflowPrefixKey);
        wfName = sol.create("sol.common.Template", { source: me.config.workflows.Deploy.workflowNameTemplate }).apply({ wfPrefix: prefix, mode: me.mode });
        break;
      case "undeploy":
        prefix = me.getLocalizedString(me.ci, me.config.workflows.Undeploy.workflowPrefixKey);
        wfName = sol.create("sol.common.Template", { source: me.config.workflows.Undeploy.workflowNameTemplate }).apply({ wfPrefix: prefix, mode: me.mode });
        break;
      default:
        prefix = me.getLocalizedString(me.ci, me.config.workflows.Undeploy.workflowPrefixKey);
        wfName = sol.create("sol.common.Template", { source: me.config.workflows.Undeploy.workflowNameTemplate }).apply({ wfPrefix: prefix, mode: me.mode });
    }
    return wfName;
  }

});

/**
 * @member sol.dev.ix.actions.Deploy
 * @method RF_sol_dev_action_Deploy
 * @static
 * @inheritdoc sol.common.ix.FunctionBase#RF_FunctionName
 */
function RF_sol_dev_action_Deploy(ec, configAny) {
  logger.enter("RF_sol_dev_action_Deploy", configAny);
  var rfUtils = sol.common.ix.RfUtils,
      config = rfUtils.parseAndCheckParams(ec, arguments.callee.name, configAny, "objId", "mode"),
      Deploy, result;

  config.ci = ec.ci;
  config.user = ec.user;

  Deploy = sol.create("sol.dev.ix.actions.Deploy", config);
  result = Deploy.execute();
  logger.exit("RF_sol_dev_action_Deploy", result);
  return result;
}