/**
 * Prepares a document for the template generating.
 *
 * @eloas
 * @requires sol.common.SordUtils
 * @requires sol.common.RepoUtils
 * @requires sol.common.WfUtils
 * @requires sol.common.Template
 * @requires sol.common.TranslateTerms
 * @requires sol.common.ObjectFormatter.TemplateSord
 * @requires sol.common.as.ActionBase
 */
sol.define("sol.contract.as.actions.PrepareDocument", {
  extend: "sol.common.as.ActionBase",

  solution: "contract",

  requiredProperty: ["parentId", "templateId"],

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

    sol.common.TranslateTerms.require("sol.contract");
  },

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

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

    sord = sol.common.RepoUtils.getSord(me.templateId);
    name = sord.name;

    objId = me.createEmptyDocument(name, sord);

    aclConfig = { mode: "SET", inherit: { fromDirectParent: true }, rights: { r: true, w: true, d: true, e: true, l: true, p: true } };
    if (me.userId) {
      aclConfig.users = [me.userId];
    }

    sol.common.AclUtils.changeRightsInBackground(objId, aclConfig);

    flowId = me.startMaskStandardWorkflow(objId, { name: name, field: "STANDARD_WORKFLOW" });

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

    me.addActionEvent("sol.contract.as.actions.CreateDocument", {
      objId: objId,
      templateId: me.templateId,
      editParts: true,
      partIdsFromMapTableKey: "CLAUSE_ID",
      searchPartIdFieldName: "CLAUSE_ID",
      partIdsTargetFieldName: "CONTRACT_CLAUSES"
    }, {
      type: "WF_STATUS",
      value: "CREATE",
      flowId: flowId
    });
  },

  createEmptyDocument: function (name, sord) {
    var me = this,
        objId, mapKeys, objKeys, config;

    objKeys = sol.common.SordUtils.getTemplateSord(sord).sord.objKeys;

    objKeys.SOL_TYPE = "CONTRACT_DOCUMENT";

    config = {
      parentId: me.parentId,
      name: name,
      maskId: sord.mask,
      objKeysObj: objKeys,
      contentString: " "
    };

    me.logger.debug("create document from template... ", objKeys);
    objId = sol.common.RepoUtils.saveToRepo(config);

    me.logger.debug("read mapKeys from template document...");
    mapKeys = ixConnect.ix().checkoutMap(MapDomainC.DOMAIN_SORD, me.templateId, null, LockC.NO).items;
    if (mapKeys && mapKeys.length > 0) {
      me.logger.debug("write mapKeys to new document...");
      ixConnect.ix().checkinMap(MapDomainC.DOMAIN_SORD, objId, objId, mapKeys, LockC.NO);
      me.logger.debug("applied map keys.");
    }

    return objId;
  }
});


/**
 * Creates a document from a template and saves it as new version on a prepared document.
 *
 * @eloas
 * @requires sol.common.Template
 * @requires sol.common.TranslateTerms
 * @requires sol.common.ObjectFormatter.TemplateSord
 * @requires sol.common.as.DocumentGenerator
 * @requires sol.common.as.ActionBase
 * @requires sol.common.as.renderer.Word
 */
sol.define("sol.contract.as.actions.CreateDocument", {
  extend: "sol.common.as.ActionBase",

  requiredProperty: ["objId", "templateId"],

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

    sol.common.TranslateTerms.require("sol.contract");
  },

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

  process: function () {
    var me = this,
        name = sol.create("sol.common.Template", { source: me.config.document.defaultName }).apply(),
        generator, result, sord, extension;

    sord = sol.common.RepoUtils.getSord(me.objId, { sordZ: SordC.mbAll });
    extension = String(sord.docVersion.ext).toLowerCase();

    // this means this is a new document
    if (extension.indexOf("do") != 0) {
      sord = sol.common.RepoUtils.getSord(me.templateId, { sordZ: SordC.mbAll });
    }

    extension = String(sord.docVersion.ext).toLowerCase();
    if (extension.indexOf("do") != 0) {
      me.addErrorEvent("sol.contract.msg.wrongDocType", null, null, ixConnect.loginResult.clientInfo.language);
      return;
    }

    generator = sol.create("sol.common.as.DocumentGenerator", {
      name: name,
      dataCollector: "RF_sol_common_service_ParentDataCollector",
      renderer: "sol.common.as.renderer.Word",
      collectorConfig: {
        objId: me.objId,
        allMapFields: true
      },
      rendererConfig: {
        objId: me.objId,
        templateId: sord.id,
        editParts: me.editParts,
        updateParts: me.updateParts,
        fillContentControls: me.fillContentControls,
        partIdsFromMapTableKey: me.partIdsFromMapTableKey,
        searchPartIdFieldName: me.searchPartIdFieldName,
        partIdsTargetFieldName: me.partIdsTargetFieldName
      }
    });

    result = generator.process();

    if (result.objId) {
      me.addGotoIdEvent(result.objId, true);
    }
  }
});