import express from 'express';
import compression from 'compression';
import expressStaticGzip from 'express-static-gzip';
// not part of react-helmet
import helmet from 'helmet';
import gnuTP from 'gnu-terry-pratchett';
import nodeLogger from '../utilities/loggers/logger.node';

// require instead of import because the relative imports need to run first
const morgan = require('morgan');

const logger = nodeLogger(`spartacus:${__filename}`);

const publicDirectory = 'build/public';

logger.debug(
  `Application outputting logs to directory "${process.env.LOG_DIR}"`,
);

/* eslint class-methods-use-this: ["error", { "exceptMethods": ["write"] }] */
class LoggerStream {
  write(message) {
    logger.info(message.substring(0, message.lastIndexOf('\n')));
  }
}

const server = () => express();

const expressServer = server()
  .disable('x-powered-by')
  .use(
    morgan('tiny', {
      skip: (req, res) => res.statusCode === 200,
      stream: new LoggerStream(),
    }),
  )
  .use(compression())
  .use(helmet({ frameguard: { action: 'deny' } }))
  .use(
    expressStaticGzip(publicDirectory, {
      enableBrotli: true,
      orderPreference: ['br'],
    }),
  )
  .use(gnuTP())
  .get('/status', (req, res) => {
    res.sendStatus(200);
  });

export default expressServer;
