import * as path from "path";

import bodyParser from "body-parser";
import compression from "compression";
import cors from "cors";
import express from "express";
import formidableMiddleware from 'express-formidable';
import expressStatusMonitor from "express-status-monitor";
import helmet from "helmet";
import morgan from "morgan";

import api from "./api";
import {Response} from "./api/classes/response";

export class Server {

  public app: express.Application;

  public static bootstrap(): Server {
    console.info('SERVER HAS BEEN BOOTSTRAPPED');
    return new Server();
  }

  constructor() {
    this.app = express();

    this.config();
  }

  private config() {
    this.app.use(express.static(path.join(__dirname, 'public')));

    this.app.use(morgan('tiny'));

    this.app.use(bodyParser.json({ limit: '50mb' }));
    this.app.use(bodyParser.urlencoded({ extended: true }));

    this.app.use(helmet());
    this.app.use(cors());
    this.app.use(compression());
    this.app.use(expressStatusMonitor());

    // this.app.use(formidableMiddleware());

    this.app.use('/api', api);

    this.app.use((err: any, _req: express.Request, _res: express.Response, next: express.NextFunction) => {
      err.status = 404;
      next(err);
    });

    this.app.use((err: any, _req: express.Request, res: express.Response, next: express.NextFunction) => {
      console.error(err);
      Response.buildError('Server error', err.message || err).send(res);
    });

    console.info('SERVER HAS BEEN CONFIGURED');
  }

}
