importPackage(Packages.de.elo.ix.client);
importPackage(Packages.de.elo.client.scripting.interfaces);
importPackage(org.apache.commons.io);

importClass(Packages.de.elo.client.scripting.constants.CONSTANTS);

//@include lib_Class.js
//@include lib_moment.js
//@include lib_sol.common.Cache.js
//@include lib_sol.common.Config.js
//@include lib_sol.common.JsonUtils.js
//@include lib_sol.common.SordUtils.js
//@include lib_sol.common.StringUtils.js
//@include lib_sol.common.DateUtils.js
//@include lib_sol.common.IxUtils.js
//@include lib_sol.common.AsyncUtils.js
//@include lib_sol.common.RepoUtils.js
//@include lib_sol.common.SordTypeUtils.js
//@include lib_sol.common.WfUtils.js
//@include lib_sol.common.FileUtils.js
//@include lib_sol.common.HttpUtils.js
//@include lib_sol.common.ZipUtils.js
//@include lib_sol.common.ExecUtils.js
//@include lib_sol.common.UserUtils.js
//@include lib_sol.common.UserProfile.js
//@include lib_sol.common.jc.CommonDialogs.js
//@include lib_sol.dev.jc.GotoId.js
//@include lib_sol.dev.jc.BuildPackages.js
//@include lib_sol.dev.jc.Versions.js
//@include lib_sol.dev.jc.ExecuteRf.js
//@include lib_sol.dev.jc.DownloadBranches.js
//@include lib_sol.dev.install.Installer.js

sol.ns("sol.dev");
sol.dev.extraTabNo = 99;
sol.dev.extraTabName = "TAB_SOL_DEV";
sol.dev.bandBaseNo = 10;

/**
 * @class sol.dev.jc.Main
 * @singleton
 *
 * Contructs the JavaClient script.
 * Contains all necessary includes.
 *
 * # Registered buttons
 *
 * |Name|
 * |:------|
 * |Build setup package|
 * |Build debug setup package|
 * |Reload forms|
 * |Reload IX scripts|
 * |GotoId|
 * |Execute RF|
 * |Download Branches|
 * |Generate report|
 * |Validate report|
 *
 * @author ELO Digital Office GmbH
 *
 * @requires sol.common.JsonUtils
 * @requires sol.common.SordUtils
 * @requires sol.common.StringUtils
 * @requires sol.common.IxUtils
 * @requires sol.common.AsyncUtils
 * @requires sol.common.RepoUtils
 * @requires sol.common.WfUtils
 * @requires sol.common.FileUtils
 * @requires sol.common.ZipUtils
 * @requires sol.common.jc.CommonDialogs
 * @requires sol.dev.jc.GotoId
 * @requires sol.dev.jc.BuildPackages
 * @requires sol.dev.jc.Versions
 * @requires sol.dev.jc.ExecuteRf
 * @requires sol.dev.jc.DownloadBranches
 */

/**
 * @member global.dev.JavaClientEvents
 * For ribbon extensions with the RibbonAdapter.
 * These can only be applied during this event. Ribbon extensions
 * cannot be taken into account later on.
 */
function eloExpandRibbon() {
  var tab, bandNo, bandSetup, bandReload, bandTools, bandVersionsReport, btnBuildSetupPackage,
      btnTransportPackage, btnReloadForms, btnReloadIXScripts, btnGoToId, btnExecuteRF,
      btnDownloadBranches, btnGenerateReport, btnValidateReport;

  if (!workspace.userRights.hasAdminRight()) {
    return "";
  }

  tab = ribbon.addTab(sol.dev.extraTabNo, null, sol.dev.extraTabName);
  tab.setTitle("Development");

  bandNo = sol.dev.bandBaseNo;
  bandSetup = ribbon.addBand(tab.getId(), bandNo++, "bandSetup");

  bandSetup.setTitle("Setup");
  bandReload = ribbon.addBand(tab.getId(), bandNo++, "bandReload");
  bandReload.setTitle("Reload");
  bandTools = ribbon.addBand(tab.getId(), bandNo++, "bandTools");
  bandTools.setTitle("Tools");
  bandVersionsReport = ribbon.addBand(tab.getId(), bandNo++, "bandVersionsReport");
  bandVersionsReport.setTitle("Versions report");

  btnBuildSetupPackage = ribbon.addButton(tab.getId(), bandSetup.getId(), "btnBuildSetupPackage");
  btnBuildSetupPackage.title = "Build setup package";
  btnBuildSetupPackage.setIconName("ScriptButton650");
  btnBuildSetupPackage.setCallback(function () {
    buildSetupPackage();
  }, this);

  btnTransportPackage = ribbon.addButton(tab.getId(), bandSetup.getId(), "btnTransportPackage");
  btnTransportPackage.title = "Build transport package";
  btnTransportPackage.setIconName("ScriptButton651");
  btnTransportPackage.setCallback(function () {
    transportPackage();
  }, this);

  btnReloadForms = ribbon.addButton(tab.getId(), bandReload.getId(), "btnReloadForms");
  btnReloadForms.title = "Reload forms";
  btnReloadForms.setIconName("ScriptButton652");
  btnReloadForms.setCallback(function () {
    reloadForms();
  }, this);

  btnReloadIXScripts = ribbon.addButton(tab.getId(), bandReload.getId(), "btnReloadIXScripts");
  btnReloadIXScripts.title = "Reload IX scripts";
  btnReloadIXScripts.setIconName("ScriptButton653");
  btnReloadIXScripts.setCallback(function () {
    reloadIXScripts();
  }, this);

  btnGoToId = ribbon.addButton(tab.getId(), bandTools.getId(), "btnGoToId");
  btnGoToId.title = "GotoId";
  btnGoToId.setIconName("ScriptButton655");
  btnGoToId.setCallback(function () {
    goToId();
  }, this);

  btnExecuteRF = ribbon.addButton(tab.getId(), bandTools.getId(), "btnExecuteRF");
  btnExecuteRF.title = "Execute RF";
  btnExecuteRF.setIconName("ScriptButton656");
  btnExecuteRF.setCallback(function () {
    executeRF();
  }, this);

  btnDownloadBranches = ribbon.addButton(tab.getId(), bandTools.getId(), "btnDownloadBranches");
  btnDownloadBranches.title = "Download branches";
  btnDownloadBranches.setIconName("ScriptButton657");
  btnDownloadBranches.setCallback(function () {
    downloadBranches();
  }, this);

  btnGenerateReport = ribbon.addButton(tab.getId(), bandVersionsReport.getId(), "btnGenerateReport");
  btnGenerateReport.title = "Generate report";
  btnGenerateReport.setIconName("ScriptButton658");
  btnGenerateReport.setCallback(function () {
    generateReport();
  }, this);

  btnValidateReport = ribbon.addButton(tab.getId(), bandVersionsReport.getId(), "btnValidateReport");
  btnValidateReport.title = "Validate report";
  btnValidateReport.setIconName("ScriptButton659");
  btnValidateReport.setCallback(function () {
    validateReport();
  }, this);
}

function buildSetupPackage() {
  var packageBuilder = sol.create("sol.dev.jc.BuildPackages", {});
  packageBuilder.execute();
}

function transportPackage() {
  var packageBuilder = sol.create("sol.dev.jc.BuildPackages", { transport: true });
  packageBuilder.execute();
}

function reloadForms() {
  sol.common.HttpUtils.sendRequest({ url: "{{eloWfBaseUrl}}/wf/edit.jsp?reload=1&lang=en&ticket={{ticket}}", resolve: true });
  workspace.setFeedbackMessage("Forms reloaded");
}

function reloadIXScripts() {
  var connFact, conn, timeoutSeconds;

  timeoutSeconds = 300;

  connFact = sol.common.RepoUtils.createConnFact(ixConnect.connProperties, ixConnect.sessionOptions, {
    timeoutSeconds: timeoutSeconds
  });
  conn = connFact.createFromTicket(ixConnect.loginResult.clientInfo);
  conn.ix().reloadScripts();
  conn.close();
  connFact.done();

  workspace.setFeedbackMessage("IX scripts reloaded");
}

function goToId() {
  sol.dev.jc.GotoId.execute();
}

function executeRF() {
  sol.dev.jc.ExecuteRf.execute();
}

function downloadBranches() {
  sol.dev.jc.DownloadBranches.execute();
}

function generateReport() {
  sol.dev.jc.Versions.generateReport();
}

function validateReport() {
  sol.dev.jc.Versions.validateReport();
}