//@include lib_Class.js
//@include lib_sol.common.JsonUtils.js
//@include lib_sol.common.RepoUtils.js
//@include lib_sol.common.SordUtils.js
//@include lib_sol.common.CounterUtils.js
//@include lib_sol.common.Template.js
//@include lib_sol.common.WfUtils.js
//@include lib_sol.common.ix.RfUtils.js
//@include lib_sol.common.ix.FunctionBase.js
//@include lib_sol.common.ix.functions.GenerateIdentifier.js

var logger = sol.create("sol.Logger", { scope: "sol.contract.ix.functions.generators.GenerateContractNo" });

/**
 * Generates an ID for a file by template
 */
sol.define("sol.contract.ix.functions.generators.GenerateContractNo", {
  extend: "sol.common.ix.functions.GenerateIdentifier",

  /** @cfg {String} objId (required)
   * Object ID
   */

  initialize: function (config) {
    var me = this;
    sol.ns("sol.contract");
    sol.contract.Config = sol.create("sol.common.Config", { compose: "/contract/Configuration/contract.config" }).config;
    me.$super("sol.Base", "initialize", [config]);
  },

  /**
   * @inheritdoc sol.common.ix.functions.GenerateIdentifier#getIdentifierTemplateId
   */
  getIdentifierTemplateId: function () {
    var me = this;
    return me.getTemplateId("Contract no.", sol.contract.Config.fields.contractNoGen, sol.contract.Config.generators.templateFolderIds.contractNo);
  },

  /**
   * @inheritdoc sol.common.ix.functions.GenerateIdentifier#getIdentifier
   */
  getIdentifier: function () {
    var me = this,
        contractNoFieldName = sol.contract.Config.fields.contractNo;
    if (!contractNoFieldName) {
      throw "getIdentifier(): Contract no. field name must not be empty.";
    }
    return sol.common.SordUtils.getObjKeyValue(me.sord, contractNoFieldName);
  },

  /**
   * @inheritdoc sol.common.ix.functions.GenerateIdentifier#setIdentifier
   */
  setIdentifier: function (contractNo) {
    var me = this,
        contractNoFieldName = sol.contract.Config.fields.contractNo;
    if (!contractNoFieldName) {
      throw "setIdentifier(): Contract no. field name must not be empty.";
    }
    sol.common.SordUtils.setObjKeyValue(me.sord, contractNoFieldName, contractNo);
  }
});

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

  params.objId = wFDiagram.objId;
  module = sol.create("sol.contract.ix.functions.generators.GenerateContractNo", params);

  module.process();

  logger.exit("onEnterNode_GenerateFileReference");
}

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

  params.objId = wFDiagram.objId;
  module = sol.create("sol.contract.ix.functions.generators.GenerateContractNo", params);

  module.process();

  logger.exit("onExitNode_GenerateFileReference");
}

/**
 * @member sol.common.ix.functions.Generators
 * @method RF_sol_contract_function_generateContractNo
 * @static
 * @inheritdoc sol.common.ix.FunctionBase#RF_FunctionName
 */
function RF_sol_contract_function_generateContractNo(iXSEContext, args) {
  logger.enter("RF_sol_common_function_generateFileReference", args);
  var params = sol.common.ix.RfUtils.parseAndCheckParams(iXSEContext, arguments.callee.name, args, "objId"),
      module = sol.create("sol.contract.ix.functions.generators.GenerateContractNo", params),
      result;
  result = module.process();
  logger.exit("RF_sol_contract_function_generateContractNo");
  return result;
}