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

//@include lib_Class.js
//@include lib_sol.common.Config.js
//@include lib_sol.common.Template.js
//@include lib_sol.common.SordUtils.js
//@include lib_sol.common.SordTypeUtils.js
//@include lib_sol.common.RepoUtils.js
//@include lib_sol.common.ix.ServiceBase.js

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

/**
 * @author ESt, ELO Digital Office GmbH
 * @version 1.0
 *
 * Uploads a file into a folder (objId) and returns the objId and guid of the created file.
 *
 * @cfg {String} objId (required) target folder
 * @cfg {String} base64Content (required) base64 String
 * @cfg {String} extension  (required) file extension (jpg, png)
 * @cfg {Number} encryptionSet (optional) encryption set
 * @cfg {Object} cfg (required)
 * @cfg {String} cfg.maskName (required) mask name for target file
 * @cfg {String} cfg.fileName (required) file name for target file
 * @cfg {String} cfg.extension (optional) extension e.g. "png". will use "jpg" as fallback if undefined
 * @cfg {String} cfg.type (optional) sord type for target file
 *
 * @eloix
 * @requires sol.common.Config
 * @requires sol.common.Template
 * @requires sol.common.ix.ServiceBase
 * @requires sol.common.RepoUtils
 *
 */
sol.define("sol.common.ix.services.UploadFile", {
  extend: "sol.common.ix.ServiceBase",
  requiredConfig: ["objId", "base64Content"],

  docExists: function (folderId, name, mask, ext) {
    var me = this;
    try {
      return (function (oldDoc) {
        return oldDoc && (+(oldDoc.mask) === +(mask) || String(oldDoc.maskName) === mask) && String(oldDoc.docVersion.ext) == ext && oldDoc.id;
      })(ixConnect.ix().checkoutSord("ARCPATH[" + sol.common.RepoUtils.getSord(folderId).guid + "]:/" + name, SordC.mbAll, LockC.NO));
    } catch (e) {
      return me.logger.debug("No old version found: ", e) && false;
    }
  },

  /**
   * Uploads the given file base64 content
   * @return {Object} Contains the `objId` of the uploaded image
   */
  process: function () {
    var me = this,
        dstObjId, dstGuid, targetFolder, oldFileId, configForSaveToRepo, fileName = me.cfg.fileName || me.cfg.pictureName, sord;

    targetFolder = ixConnect.ix().checkoutSord(me.objId, SordC.mbAllIndex, LockC.NO).id;
    fileName = ~fileName.indexOf("{{") ? sol.common.TemplateUtils.render(fileName) : fileName;

    configForSaveToRepo = {
      name: fileName,
      base64Content: me.base64Content,
      extension: me.extension,
      encryptionSet: me.encryptionSet,
      maskId: me.cfg.maskName
    };

    oldFileId = me.docExists(targetFolder, fileName, me.cfg.maskName, me.extension);
    configForSaveToRepo[(oldFileId ? "objId" : "parentId")] = oldFileId || targetFolder;

    dstObjId = sol.common.RepoUtils.saveToRepo(configForSaveToRepo);
    sord = ixConnect.ix().checkoutSord(dstObjId, EditInfoC.mbSord, LockC.NO).sord;
    dstGuid = sord.guid;

    if (me.cfg.type) {
      try {
        if (Number.isInteger(parseInt(me.cfg.type, 10))) {
          sord.type = parseInt(me.cfg.type, 10);
        } else {
          sord.type = sol.common.SordTypeUtils.getSordTypeId(me.cfg.type);
        }
      } catch (e) {
        me.logger.debug("could not retrieve sordtype via id", e);
        throw "UploadFile: could not retrieve sordtype via id `" + me.cfg.type + "`";
      }
      try {
        ixConnect.ix().checkinSord(sord, SordC.mbAllIndex, LockC.NO);
      } catch (e) {
        me.logger.debug("updating sord type failed during checkin", e);
        throw "UploadFile: updating sord type failed during checkin.";
      }
    }

    return { objId: dstObjId, guid: String(dstGuid) };
  }
});

/**
 * @member sol.common.ix.services.UploadFile
 * @method RF_sol_common_service_UploadFile
 * @static
 * @inheritdoc sol.common.ix.ServiceBase#RF_ServiceBaseName
 */
function RF_sol_common_service_UploadFile(iXSEContext, args) {
  logger.enter("RF_sol_common_service_UploadFile", args);
  var params, service, result;

  params = sol.common.ix.RfUtils.parseAndCheckParams(iXSEContext, arguments.callee.name, args, "objId", "base64Content", "cfg");
  service = sol.create("sol.common.ix.services.UploadFile", {
    objId: params.objId,
    base64Content: params.base64Content,
    extension: params.extension,
    encryptionSet: params.encryptionSet,
    cfg: params.cfg
  });
  result = JSON.stringify(service.process());
  logger.exit("RF_sol_common_service_UploadFile", result);

  return result;
}

/**
 * @deprecated moved here from common_document for backwards compatibility
 * @member sol.common_document.ix.services.UploadFile
 * @method RF_sol_common_document_service_UploadFile
 * @static
 * @inheritdoc sol.common.ix.ServiceBase#RF_ServiceBaseName
 */
function RF_sol_common_document_service_UploadFile(iXSEContext, args) {
  logger.enter("RF_sol_common_document_service_UploadFile", args);
  var params, service, result;

  params = sol.common.ix.RfUtils.parseAndCheckParams(iXSEContext, arguments.callee.name, args, "objId", "base64Content", "cfg");
  service = sol.create("sol.common.ix.services.UploadFile", {
    objId: params.objId,
    base64Content: params.base64Content,
    extension: params.extension || "jpg",
    encryptionSet: params.encryptionSet,
    cfg: params.cfg
  });
  result = JSON.stringify(service.process());
  logger.exit("RF_sol_common_document_service_UploadFile", result);

  return result;
}