/* eslint-disable no-console */
const express = require('express');
const proxyMiddleware = require('http-proxy-middleware');
const next = require('next');
const envVars = require('/tmp/hyperglass.env.json');
const { configFile } = envVars;
const config = require(String(configFile));

const { NODE_ENV: env, _HYPERGLASS_URL_: envUrl } = config;

const devProxy = {
  '/api/query/': { target: envUrl + 'api/query/', pathRewrite: { '^/api/query/': '' } },
  '/images': { target: envUrl + 'images', pathRewrite: { '^/images': '' } },
  '/custom': { target: envUrl + 'custom', pathRewrite: { '^/custom': '' } },
};

const port = parseInt(process.env.PORT, 10) || 3000;
const dev = env !== 'production';
const app = next({
  dir: '.', // base directory where everything is, could move to src later
  dev,
});

const handle = app.getRequestHandler();

let server;
app
  .prepare()
  .then(() => {
    server = express();

    // Set up the proxy.
    if (dev && devProxy) {
      Object.keys(devProxy).forEach(function (context) {
        server.use(proxyMiddleware(context, devProxy[context]));
      });
    }

    // Default catch-all handler to allow Next.js to handle all other routes
    server.all('*', (req, res) => handle(req, res));

    server.listen(port, err => {
      if (err) {
        throw err;
      }
      console.log(`> Ready on port ${port} [${env}]`);
    });
  })
  .catch(err => {
    console.log('An error occurred, unable to start the server');
    console.log(err);
  });
