const Constants = require('../../constants');
const helpers = require('../../helpers');

const addListeners = (ipcMain, {standardIPCReply}) => {
  ipcMain.on(Constants.IPC_Get_Config, (event, data) => {
    helpers
    .getConfig(data.Version, data.Provider, data.Remote, data.S3)
    .then((data) => {
      if (data.Code === 0) {
        standardIPCReply(event, Constants.IPC_Get_Config_Reply, {
          Config: data.Data,
        });
      } else {
        standardIPCReply(event, Constants.IPC_Get_Config_Reply, {}, data.Code);
      }
    })
    .catch(error => {
      standardIPCReply(event, Constants.IPC_Get_Config_Reply, {}, error);
    });
  });

  ipcMain.on(Constants.IPC_Get_Config_Template, (event, data) => {
    helpers
    .getConfigTemplate(data.Version, data.Provider, data.Remote, data.S3)
    .then((data) => {
      standardIPCReply(event, Constants.IPC_Get_Config_Template_Reply, {
        Template: data,
      });
    })
    .catch(error => {
      standardIPCReply(event, Constants.IPC_Get_Config_Template_Reply, {}, error);
    });
  });

  ipcMain.on(Constants.IPC_Set_Config_Values, (event, data) => {
    const setConfigValue = (i) => {
      if (i < data.Items.length) {
        helpers
        .setConfigValue(data.Items[i].Name, data.Items[i].Value, data.Provider, data.Remote, data.S3, data.Version)
        .then(() => {
          setConfigValue(++i);
        })
        .catch(error => {
          standardIPCReply(event, Constants.IPC_Set_Config_Values_Reply, {}, error);
        });
      } else {
        standardIPCReply(event, Constants.IPC_Set_Config_Values_Reply, {});
      }
    };
    setConfigValue(0);
  });
};

module.exports = {
  addListeners
};
