import express, { Router } from 'express';

import * as leadController from '@/modules/lead/lead.controller';
import { setAuditFields } from '@/shared/middleware/setAuditFields';
import { AuditMode } from '@/shared/constants/enum.constant';
import { MODULE_LIST } from '@/shared/constants/module.constant';
import userAuthAndCheckPermissions from '@/modules/auth/auth.user.middleware';
import { ACTIONS } from '@/shared/constants';
import { validateMiddleware } from '@/shared/utils/middlewares';
import * as leadValidation from '@/modules/lead/lead.validation';

const router: Router = express.Router();

router
  .route('/')
  .get(
    userAuthAndCheckPermissions(MODULE_LIST.LEAD, ACTIONS.READ),
    leadController.queryLeads,
  )
  .post(
    userAuthAndCheckPermissions(MODULE_LIST.LEAD, ACTIONS.CREATE),
    setAuditFields({ mode: AuditMode.CREATE, companyField: 'company' }),
    leadController.createLead,
  );

router
  .route('/analytics')
  .get(
    userAuthAndCheckPermissions(MODULE_LIST.LEAD, ACTIONS.READ),
    leadController.getLeadAnalytics,
  );

router
  .route('/export')
  .get(
    userAuthAndCheckPermissions(MODULE_LIST.LEAD, ACTIONS.READ),
    leadController.exportLeads,
  );

router
  .route('/bulkUpload')
  .post(
    userAuthAndCheckPermissions(MODULE_LIST.LEAD, ACTIONS.CREATE),
    validateMiddleware(leadValidation.createBulkLead),
    setAuditFields({ mode: AuditMode.CREATE, companyField: 'company' }),
    leadController.createBulkLead,
  );

router
  .route('/transferLead')
  .post(
    userAuthAndCheckPermissions(MODULE_LIST.LEAD, ACTIONS.UPDATE),
    setAuditFields({ mode: AuditMode.CREATE, companyField: 'company' }),
    leadController.transferLead,
  );

router
  .route('/:id/move')
  .patch(
    userAuthAndCheckPermissions(MODULE_LIST.LEAD, ACTIONS.UPDATE),
    validateMiddleware(leadValidation.moveLead),
    leadController.moveLead,
  );

  router
  .route('/bulkUpdate')
  .patch(
    userAuthAndCheckPermissions(MODULE_LIST.LEAD, ACTIONS.UPDATE),
    validateMiddleware(leadValidation.bulkUpdateLead),
    setAuditFields({ mode: AuditMode.UPDATE, companyField: 'company' }),
    leadController.bulkUpdateLeads,
  );

router
  .route('/suggestedProperties/:id')
  .get(
    userAuthAndCheckPermissions(MODULE_LIST.LEAD, ACTIONS.READ),
    leadController.getSuggestedProperties,
  )
  .post(
    userAuthAndCheckPermissions(MODULE_LIST.LEAD, ACTIONS.UPDATE),
    validateMiddleware(leadValidation.addSuggestedProperties),
    leadController.addSuggestedProperties,
  );

router
  .route('/suggestedProjects/:id')
  .get(
    userAuthAndCheckPermissions(MODULE_LIST.LEAD, ACTIONS.READ),
    leadController.getSuggestedProjects,
  );

router
  .route('/shortList/:id')
  .patch(
    userAuthAndCheckPermissions(MODULE_LIST.LEAD, ACTIONS.UPDATE),
    leadController.updateShortList,
  );

router
  .route('/bulk-delete')
  .post(
    userAuthAndCheckPermissions(MODULE_LIST.LEAD, ACTIONS.DELETE),
    validateMiddleware(leadValidation.bulkDeleteLeads),
    leadController.bulkDeleteLeads,
  );

router
  .route('/:id/activity-counts')
  .get(
    userAuthAndCheckPermissions(MODULE_LIST.LEAD, ACTIONS.READ),
    leadController.getLeadActivityCounts,
  );

router
  .route('/:id/activity-counts/recalculate')
  .post(
    userAuthAndCheckPermissions(MODULE_LIST.LEAD, ACTIONS.UPDATE),
    leadController.recalculateLeadActivityCounts,
  );

router
  .route('/:id')
  .get(
    userAuthAndCheckPermissions(MODULE_LIST.LEAD, ACTIONS.READ),
    leadController.getLeadById,
  )
  .patch(
    userAuthAndCheckPermissions(MODULE_LIST.LEAD, ACTIONS.UPDATE),
    setAuditFields({ mode: AuditMode.UPDATE, companyField: 'company' }),
    leadController.updateLead,
  )
  .delete(userAuthAndCheckPermissions(), leadController.deleteLeadById);


router
  .route('/:id/referenceLead')
  .get(userAuthAndCheckPermissions(), leadController.checkIfRefLead);

// MyOperator integration routes
router
  .route('/:leadId/myoperator-status')
  .get(
    userAuthAndCheckPermissions(MODULE_LIST.LEAD, ACTIONS.READ),
    leadController.getLeadMyOperatorStatus,
  );

router
  .route('/:leadId/call-history')
  .get(
    userAuthAndCheckPermissions(MODULE_LIST.LEAD, ACTIONS.READ),
    leadController.getLeadCallHistory,
  );

export default router;
