const {app, dialog, ipcMain} = require("electron");
const admZip = require("adm-zip");
const path = require("path");
const fs = require("fs-extra");
const os = require("os");

class Accounts {
  constructor() {}

  getKeyStoreLocation() {
    switch (os.type()) {
      case "Darwin":
        return path.join(os.homedir(), "Library", "Ether1", "keystore");
        break;
      default:
        return path.join(process.env.APPDATA, "Ether1", "keystore");
    }
  }

  exportAccounts() {
    var savePath = dialog.showSaveDialog({
      defaultPath: path.join(app.getPath("documents"), "accounts.zip")
    });

    if (savePath) {
      const accPath = EthoAccounts.getKeyStoreLocation();

      fs.readdir(accPath, function (err, files) {
        var zip = new admZip();

        for (let filePath of files) {
          zip.addFile(filePath, fs.readFileSync(path.join(accPath, filePath)));
        }

        // store zip to path
        zip.writeZip(savePath);
      });
    }
  }

  importAccounts(accountsFile) {
    var extName = path.extname(accountsFile).toUpperCase();
    const accPath = EthoAccounts.getKeyStoreLocation();

    if (extName == ".ZIP") {
      var zip = new admZip(accountsFile);
      zip.extractAllTo(accPath, true);
      return {success: true, text: "Accounts ware successfully imported."};
    } else {
      try {
        fs.copySync(accountsFile, path.join(accPath, path.basename(accountsFile)));
        return {success: true, text: "Account was successfully imported."};
      } catch (err) {
        return {success: false, text: err};
      }
    }
  }

  saveAccount(account) {
    fs.writeFile(path.join(tEthoAccountshis.getKeyStoreLocation(), "0x" + account.address), JSON.stringify(account), "utf8", function () {
      // file was written
    });
  }
}

ipcMain.on("exportAccounts", (event, arg) => {
  EthoAccounts.exportAccounts();
});

ipcMain.on("importAccounts", (event, arg) => {
  var openPath = dialog.showOpenDialog({
    defaultPath: app.getPath("documents"),
    filters: [
      {
        name: "archive",
        extensions: ["zip"]
      }, {
        name: "json",
        extensions: ["json"]
      }, {
        name: "All",
        extensions: ["*.*"]
      }
    ]
  });

  if (openPath) {
    event.returnValue = EthoAccounts.importAccounts(openPath[0]);
  } else {
    event.returnValue = {};
  }
});

ipcMain.on("saveAccount", (event, arg) => {
  EthoAccounts.saveAccount(arg);
  event.returnValue = true;
});

EthoAccounts = new Accounts();