import express, { Router } from 'express';

import { validateMiddleware } from '@/shared/utils/middlewares/index';
import userAuthAndCheckPermissions from '@/modules/auth/auth.user.middleware';

import * as userValidation from '@/modules/user/user.validation';
import * as userController from '@/modules/user/user.controller';
import { setAuditFields } from '@/shared/middleware/setAuditFields';
import { AuditMode } from '@/shared/constants/enum.constant';
import { MODULE_LIST } from '@/shared/constants/module.constant';
import { ACTIONS } from '@/shared/constants';

const router: Router = express.Router();

// TODO: handle user combination get

router
  .route('/')
  .post(
    userAuthAndCheckPermissions(MODULE_LIST.USER, ACTIONS.CREATE),
    validateMiddleware(userValidation.createUser),
    setAuditFields({ mode: AuditMode.CREATE }),
    userController.createUser,
  )
  .get(userController.getUsers);

router
  .route('/sidebar-analytics')
  .get(userAuthAndCheckPermissions(), userController.getSidebarAnalytics);

router
  .route('/:userId')
  .get(
    userAuthAndCheckPermissions(MODULE_LIST.USER, ACTIONS.READ),
    validateMiddleware(userValidation.getUser),
    userController.getUser,
  )
  .patch(
    userAuthAndCheckPermissions(MODULE_LIST.USER, ACTIONS.UPDATE),
    validateMiddleware(userValidation.updateUser),
    setAuditFields({ mode: AuditMode.UPDATE }),
    userController.updateUser,
  )
  .delete(
    userAuthAndCheckPermissions(MODULE_LIST.USER, ACTIONS.DELETE),
    validateMiddleware(userValidation.deleteUser),
    userController.deleteUser,
  );

router
  .route('/:userId/profile')
  .get(
    userAuthAndCheckPermissions(),
    validateMiddleware(userValidation.getUser),
    userController.getUser,
  );

router
  .route('/:userId/reset-password')
  .patch(
    userAuthAndCheckPermissions(MODULE_LIST.USER, ACTIONS.UPDATE),
    validateMiddleware(userValidation.resetPassword),
    userController.resetPassword,
  );

export default router;
