text: 'use strict';
  
  var LevelStorage = require('../lib/storage_leveldb');
  var MongoStorage = require('../lib/storage');
  var Bitcore = require('bitcore-lib');
  
  var level = new LevelStorage({
    dbPath: './db',
  });
  
  var mongo = new MongoStorage();
  mongo.connect({
      mongoDb: {
        uri: 'mongodb://localhost:27017/bws',
      }
    },
    function(err) {
      if (err) throw err;
      run(function(err) {
        if (err) throw err;
        console.log('All data successfully migrated');
        process.exit(0);
        // mongo._dump(function() {
        //   process.exit(0);
        // });
      });
    });
  
  
  function run(cb) {
    var pending = 0,
      ended = false;
    level.db.readStream()
      .on('data', function(data) {
        pending++;
        migrate(data.key, data.value, function(err) {
          if (err) throw err;
          pending--;
          if (pending == 0 && ended) {
            return cb();
          }
        });
      })
      .on('error', function(err) {
        return cb(err);
      })
      .on('end', function() {
        console.log('All old data read')
        ended = true;
        if (!pending) {
          return cb();
        }
      });
  };
  
  function migrate(key, value, cb) {
    if (key.match(/^copayer!/)) {
      value.copayerId = key.substring(key.indexOf('!') + 1);
      mongo.db.collection('copayers_lookup').insert(value, cb);
    } else if (key.match(/!addr!/)) {
      value.walletId = key.substring(2, key.indexOf('!addr'));
      value.network = Bitcore.Address(value.address).toObject().network;
      mongo.db.collection('addresses').insert(value, cb);
    } else if (key.match(/!not!/)) {
      mongo.db.collection('notifications').insert(value, cb);
    } else if (key.match(/!p?txp!/)) {
      value.isPending = key.indexOf('!ptxp!') != -1;
      value.network = Bitcore.Address(value.toAddress).toObject().network;
      mongo.db.collection('txs').insert(value, cb);
    } else if (key.match(/!main$/)) {
      mongo.db.collection('wallets').insert(value, cb);
    } else {
      return cb(new Error('Invalid key ' + key));
    }
  };
  