const genmap = require('./generate_asset_map');
const isServer = typeof genmap === 'function';
let prefix = '';
let manifest = {};
try {
  //eslint-disable-next-line node/no-missing-require
  manifest = require('../dist/manifest.json');
} catch (e) {
  // use middleware
}

const assets = isServer ? manifest : genmap;

function getAsset(name) {
  return prefix + assets[name];
}

function setPrefix(name) {
  prefix = name;
}

function getMatches(match) {
  return Object.keys(assets)
    .filter(k => match.test(k))
    .map(getAsset);
}

const instance = {
  setPrefix: setPrefix,
  get: getAsset,
  match: getMatches,
  setMiddleware: function(middleware) {
    function getManifest() {
      return JSON.parse(
        middleware.fileSystem.readFileSync(
          middleware.getFilenameFromUrl('/manifest.json')
        )
      );
    }
    if (middleware) {
      instance.get = function getAssetWithMiddleware(name) {
        const m = getManifest();
        return prefix + m[name];
      };
      instance.match = function matchAssetWithMiddleware(match) {
        const m = getManifest();
        return Object.keys(m)
          .filter(k => match.test(k))
          .map(k => prefix + m[k]);
      };
    }
  }
};

module.exports = instance;