import {NextFunction, Request, Response} from 'express';
import {Logger} from '../Logger';

/**
 * Adds logging to express
 */
export class LoggerRouter {
  public static route(app: any) {

    app.get('/api*', (req: Request, res: Response, next: NextFunction) => {
      req['_startTime'] = Date.now();
      req['logged'] = true;
      const end = res.end;
      res.end = (a?: any, b?: any, c?: any) => {
        res.end = end;
        res.end(a, b, c);
        Logger.verbose(req.method, req.url, res.statusCode, (Date.now() - req['_startTime']) + 'ms');
      };
      return next();
    });

    app.get('/node_modules*', (req: Request, res: Response, next: NextFunction) => {
      req['_startTime'] = Date.now();
      req['logged'] = true;
      const end = res.end;
      res.end = (a?: any, b?: any, c?: any) => {
        res.end = end;
        res.end(a, b, c);
        Logger.silly(req.method, req.url, res.statusCode, (Date.now() - req['_startTime']) + 'ms');
      };
      return next();
    });

    app.use((req: Request, res: Response, next: NextFunction) => {
      if (req['logged'] === true) {
        return next();
      }
      req['_startTime'] = Date.now();
      const end = res.end;
      res.end = (a?: any, b?: any, c?: any) => {
        res.end = end;
        res.end(a, b, c);
        Logger.debug(req.method, req.url, res.statusCode, (Date.now() - req['_startTime']) + 'ms');
      };
      return next();
    });

  }
}