const { FileSystem } = require('../src/index');

let Provider;
try {
  Provider = require('fsProvider');
}
catch (err) {
  Provider = require('./providers/default');
}

const provider = new Provider();

let onFsReady;
let onFsError;

let fsReady = new Promise((resolve, reject) => {
  onFsReady = resolve;
  onFsError = reject;
});

var fsInstance = new FileSystem({ provider }, (err) => {
  if (err) {
    onFsError(err);
  } else {
    onFsReady(true);
  }
});

function proxyHasProp(target, prop) {
  return prop in target;
}

const fsPromises = new Proxy(fsInstance.promises, {
  get(target, prop) {
    if (!proxyHasProp(target, prop)) {
      return;
    }

    return async (...args) => {
      await fsReady;
      return await target[prop](...args);
    };
  },
});

const fs = new Proxy(fsInstance, {
  get(target, prop) {
    if (!proxyHasProp(target, prop)) {
      return;
    }

    if (prop === 'promises') {
      return fsPromises;
    }

    return (...args) => {
      (async () => {
        await fsReady;
        target[prop](...args);
      })();
    };
  },
});

module.exports = fs;
