import express, { Router } from 'express';

import * as teamValidation from '@/modules/tasks/tasks.validation';
import * as teamController from '@/modules/tasks/tasks.controller';

import { validateMiddleware } from '@/shared/utils/middlewares/index';
import userAuthAndCheckPermissions from '@/modules/auth/auth.user.middleware';
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();

router
  .route('/')
  .get(
    userAuthAndCheckPermissions(MODULE_LIST.TASKS, ACTIONS.READ),
    validateMiddleware(teamValidation.getTasks),
    teamController.getTasks,
  )
  .post(
    userAuthAndCheckPermissions(MODULE_LIST.TASKS, ACTIONS.CREATE),
    validateMiddleware(teamValidation.createTasks()),
    setAuditFields({ mode: AuditMode.CREATE, companyField: 'companyId' }),
    teamController.createTasks,
  );

router
  .route('/bulk/update')
  .patch(
    userAuthAndCheckPermissions(MODULE_LIST.TASKS, ACTIONS.UPDATE),
    validateMiddleware(teamValidation.bulkUpdateTasks()),
    teamController.bulkUpdateTasks,
  );

router
  .route('/bulk/delete')
  .delete(
    userAuthAndCheckPermissions(MODULE_LIST.TASKS, ACTIONS.DELETE),
    validateMiddleware(teamValidation.bulkDeleteTasks),
    teamController.bulkDeleteTasks,
  );

router
  .route('/export')
  .get(
    userAuthAndCheckPermissions(MODULE_LIST.TASKS, ACTIONS.READ),
    teamController.exportTasks,
  );

router
  .route('/:id')
  .get(
    userAuthAndCheckPermissions(MODULE_LIST.TASKS, ACTIONS.READ),
    validateMiddleware(teamValidation.getTasksById),
    teamController.getTasksById,
  )
  .patch(
    userAuthAndCheckPermissions(MODULE_LIST.TASKS, ACTIONS.UPDATE),
    validateMiddleware(teamValidation.updateTasks()),
    setAuditFields({ mode: AuditMode.UPDATE, companyField: 'companyId' }),
    teamController.updateTasks,
  )
  .delete(
    userAuthAndCheckPermissions(MODULE_LIST.TASKS, ACTIONS.DELETE),
    validateMiddleware(teamValidation.deleteTasksById),
    teamController.deleteTasksById,
  );

export default router;
