import express, { Router } from 'express';
import validate from '@/shared/utils/middlewares/validate.middleware';
import * as locationValidation from '@/modules/master/location/location.validation';
import { capitalize } from '@/shared/utils/commonHelper';
import * as locationController from '@/modules/master/location/location.controller';
import userAuthAndCheckPermissions from '@/modules/auth/auth.user.middleware';
import { setAuditFields } from '@/shared/middleware/setAuditFields';
import { AuditMode } from '@/shared/constants/enum.constant';
import * as locationPlaceController from '@/modules/master/location/location.place.controller';

const router: Router = express.Router();

router
  .route('/place-id')
  .post(
    userAuthAndCheckPermissions(),
    validate(locationValidation.validate.createFromPlaceId),
    setAuditFields({ mode: AuditMode.CREATE }),
    locationPlaceController.createFromPlaceId,
  );

function dynamicValidation(action: 'get' | 'create' | 'update' | 'delete') {
  return (req, res, next) => {
    const { type } = req.params;
    const capitalType = capitalize(type);
    const validationKey = `${action}${capitalType}`;
    const validationSchema = locationValidation.validate[validationKey];

    if (!validationSchema) return next(new Error(`Invalid type: ${type}`));

    return validate(validationSchema)(req, res, next);
  };
}

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

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

export default router;