const {app, dialog, ipcMain} = require('electron');
const storage = require('electron-storage');
const datastore = require('nedb');
const moment = require('moment');
const path = require('path');
const fs = require('fs');

const dbPath = path.join(app.getPath('userData'), 'storage.db');
const db = new datastore({ filename: dbPath });
db.loadDatabase(function (err) {    
  // Now commands will be executed
});

// index the block field
db.ensureIndex({ fieldName: 'block' }, function (err) {
  // If there was an error, err is not null
});

// index the txhash field
db.ensureIndex({ fieldName: 'txhash', unique: true }, function (err) {
  // If there was an error, err is not null
});
  
ipcMain.on('storeTransaction', (event, arg) => {
  db.update({ txhash: arg.txhash }, arg, { upsert: true }, function (err, numReplaced, upsert) {
    // do nothing for now
  });
});
  
ipcMain.on('getTransactions', (event, arg) => {
  db.find({}).exec(function (err, docs) {
    ResultData = [];
    
    // sort the data
    docs.sort((a, b)=>{
      if ((!b.block) && (a.block)) {
        return 1;
      } else if ((b.block) && (!a.block)) {
        return -1;
      } else if ((!b.block) && (!a.block)) {
        return moment(b.timestamp, "YYYY-MM-DD HH:mm:ss").toDate() - moment(a.timestamp, "YYYY-MM-DD HH:mm:ss").toDate();
      } else {
        return b.block - a.block;
      }
    });
    
    for (i = 0; i < Math.min(docs.length, 500); i++) {
      ResultData.push([
        docs[i].block,
        docs[i].timestamp,
        docs[i].fromaddr,
        docs[i].toaddr,
        docs[i].value
      ]);
    }

    // return the transactions data
    event.returnValue = ResultData;
  });
});
  
ipcMain.on('getJSONFile', (event, arg) => {
  storage.get(arg, (err, data) => {
    if (err) {
      event.returnValue = null;
    } else {
      event.returnValue = data;
    }
  });        
});

ipcMain.on('setJSONFile', (event, arg) => {
  storage.set(arg.file, arg.data, (err) => {
    if (err) {
      event.returnValue = { success: false, error: err };
    } else {
      event.returnValue = { success: true, error: null };
    }
  });
});  

ipcMain.on('deleteTransactions', (event, arg) => {
  fs.unlink(dbPath, (err) => {
    if (err) {
      event.returnValue = { success: false, error: err };
      dialog.showErrorBox("Error deleting the file", err.message);      
    } else {
      event.returnValue = { success: true, error: null };
    }
  });
});  