const path = require('path');
const webpack = require('webpack');
const webpackDevMiddleware = require('webpack-dev-middleware');
const webpackHotMiddleware = require('webpack-hot-middleware');
const { createProxyMiddleware } = require('http-proxy-middleware');
const logger = require('../logger');

function createWebpackMiddleware(compiler, publicPath) {
  return webpackDevMiddleware(compiler, {
    logLevel: 'warn',
    publicPath,
    silent: true,
    stats: 'errors-only',
  });
}

module.exports = function addDevMiddlewares(app, webpackConfig) {
  const compiler = webpack(webpackConfig);
  const middleware = createWebpackMiddleware(
    compiler,
    webpackConfig.output.publicPath,
  );

  app.use(middleware);
  app.use(webpackHotMiddleware(compiler));

  // Since webpackDevMiddleware uses memory-fs internally to store build
  // artifacts, we use it instead
  const fs = middleware.fileSystem;
  let proxyHost = process.env.PROXY;
  const proxyPrefix = process.env.PROXY_PREFIX || '/Cityinterface';
  app.get('/setproxy', (req, res) => {
    if (req.query && req.query.host) {
      proxyHost = req.query.host;
      res.send(200);
    } else {
      res.send(400);
    }
  });

  if (
    proxyHost &&
    (proxyHost.toLowerCase() !== 'origin' ||
      proxyHost.toLowerCase() !== 'off' ||
      proxyHost !== '0')
  ) {
    logger.info(`using proxy at: ${proxyHost}`);
    logger.info(`proxy prefix: ${proxyPrefix}`);
    app.use(
      proxyPrefix,
      createProxyMiddleware({
        target: proxyHost,
        changeOrigin: true,
        // eslint-disable-next-line no-unused-vars
        onProxyReq: (_prexyReq, _req, _res) => {
          logger.info('onProxyReq');
        },
        // eslint-disable-next-line no-unused-vars
        onProxyRes(_proxyRes, _req, _res) {
          logger.info('onProxyRes');
        },
      }),
    );
  }

  app.get('*', (_req, res) => {
    fs.readFile(path.join(compiler.outputPath, 'index.html'), (err, file) => {
      if (err) {
        res.sendStatus(404);
      } else {
        res.send(file.toString());
      }
    });
  });
};