
import { NextFunction } from 'connect';
import { Request, Response, Router } from 'express'
import klawSync from 'klaw-sync'
import { join } from 'path'
import logger from './logger';

const ROUTES_PATH = join(__dirname, '../routes');

export const setupRoutes = () => {

  const router = Router();

  klawSync(ROUTES_PATH, { nodir: true })
    .filter((file) => file.path.toLowerCase().includes('route.js') || file.path.toLowerCase().includes('route.ts'))
    .forEach(async ({ path }) => {
      const file = path.replace(ROUTES_PATH, '');

      try {
        const route = await import(path); //inline require
        const routeConfig = route.route;

        switch (routeConfig.type.toLowerCase()) {
          case 'root':
            //sets up default page/get handler
            router.get(routeConfig.route, (req: Request, res: Response) => routeConfig.controller(req, res, routeConfig.validators));
            logger.info('Root pages router registered');
            break;
          case 'post':
            router.post(routeConfig.route, (req: Request, res: Response, next: NextFunction) => routeConfig.controller(req, res, next, routeConfig.validators));
            logger.info(`POST Route ${routeConfig.route} registered`)
            break;
          case 'page':
            logger.info(`PAGE Route ${routeConfig.route} registered`)
            //Does not need explicit handler, handled by root
            break;
          case 'get':
            //Should only be used when custom page handler needed
            router.get(routeConfig.route, (req: Request, res: Response, next: NextFunction) => routeConfig.controller(req, res, next, routeConfig.validators));
            logger.info(`GET Route ${routeConfig.route} registered`)
            break;
          default:
            throw Error('Invalid or Missing Page Type');
        }
      } catch (err) {
        console.error(`Error bootstrapping route:  ${file} ->  ${err}`);
      }
    });

  return router;
};