import express, { Router, Request, Response, NextFunction } from 'express';
import validate from '@/shared/utils/middlewares/validate.middleware';
import { commonValidation } from './constructionStatus.validation';

// Controllers
import * as amenitiesController from '@/modules/master/constructionStatus/amenities/amenities.controller';
import * as tagController from '@/modules/master/constructionStatus/tags/tag.controller';
import * as sourceController from '@/modules/master/constructionStatus/source/source.controller';
import userAuthAndCheckPermissions from '@/modules/auth/auth.user.middleware';
import { setAuditFields } from '@/shared/middleware/setAuditFields';
import { AuditMode } from '@/shared/constants/enum.constant';

const router: Router = express.Router();

const controllersMap: Record<string, unknown> = {
  amenities: amenitiesController,
  tags: tagController,
  source: sourceController,
};

function dynamicValidation(action: 'get' | 'create' | 'update' | 'delete') {
  return (req: Request, res: Response, next: NextFunction) => {
    const { type } = req.params;

    const typeValidation = (commonValidation as unknown)[type];
    if (!typeValidation || !typeValidation[action])
      return next(
        new Error(
          `Validation schema not found for type: ${type} and action: ${action}`,
        ),
      );

    return validate(typeValidation[action])(req, res, next);
  };
}

function controllerHandler(
  action: 'create' | 'list' | 'get' | 'update' | 'remove',
) {
  return async (req: Request, res: Response, next: NextFunction) => {
    const { type } = req.params;
    const controller = controllersMap[type];

    if (!controller || typeof controller[action] !== 'function')
      return next(new Error(`Handler for ${action} not found in ${type}`));

    return controller[action](req, res, next);
  };
}

router
  .route('/:type')
  .post(
    userAuthAndCheckPermissions(),
    dynamicValidation('create'),
    setAuditFields({ mode: AuditMode.CREATE }),
    controllerHandler('create'),
  )
  .get(
    userAuthAndCheckPermissions(),
    dynamicValidation('get'),
    controllerHandler('list'),
  );

router
  .route('/:type/:id')
  .get(
    userAuthAndCheckPermissions(),
    dynamicValidation('get'),
    controllerHandler('get'),
  )
  .patch(
    userAuthAndCheckPermissions(),
    dynamicValidation('update'),
    setAuditFields({ mode: AuditMode.UPDATE }),
    controllerHandler('update'),
  )
  .delete(
    userAuthAndCheckPermissions(),
    dynamicValidation('delete'),
    controllerHandler('remove'),
  );

export default router;
