import express, { Router } from 'express';

import * as captureLeadValidation from '@/modules/captureLeads/captureLead.validation';
import * as captureLeadController from '@/modules/captureLeads/captureLead.controller';

import userAuthAndCheckPermissions from '@/modules/auth/auth.user.middleware';
import { AuditMode } from '@/shared/constants/enum.constant';
import { setAuditFields } from '@/shared/middleware/setAuditFields';
import validate from '@/shared/utils/middlewares/validate.middleware';
import { MODULE_LIST } from '@/shared/constants/module.constant';
import { ACTIONS } from '@/shared/constants';
import * as kpiValidation from '@/modules/captureLeads/kpi.validation';
import { getCaptureLeadsKpi } from '@/modules/captureLeads/kpi.controller';

const router: Router = express.Router();

// KPI endpoint
router.get(
  '/kpi',
  userAuthAndCheckPermissions(MODULE_LIST.CAPTURE_LEAD, ACTIONS.READ),
  validate(kpiValidation.getKpi),
  getCaptureLeadsKpi,
);

// GET all / POST create
router
  .route('/')
  .get(
    userAuthAndCheckPermissions(MODULE_LIST.CAPTURE_LEAD, ACTIONS.READ),
    validate(captureLeadValidation.getCaptureLead),
    captureLeadController.getCaptureLead,
  )
  .post(
    userAuthAndCheckPermissions(MODULE_LIST.CAPTURE_LEAD, ACTIONS.CREATE),
    validate(captureLeadValidation.createCaptureLead()),
    setAuditFields({ mode: AuditMode.CREATE }),
    captureLeadController.createCaptureLead,
  );

// GET by ID / PATCH update / DELETE
router
  .route('/:id')
  .get(
    userAuthAndCheckPermissions(MODULE_LIST.CAPTURE_LEAD, ACTIONS.READ),
    validate(captureLeadValidation.getCaptureLeadById),
    captureLeadController.getCaptureLeadById,
  )
  .patch(
    userAuthAndCheckPermissions(MODULE_LIST.CAPTURE_LEAD, ACTIONS.UPDATE),
    validate(captureLeadValidation.updateCaptureLead()),
    setAuditFields({ mode: AuditMode.UPDATE }),
    captureLeadController.updateCaptureLead,
  )
  .delete(
    userAuthAndCheckPermissions(MODULE_LIST.CAPTURE_LEAD, ACTIONS.DELETE),
    validate(captureLeadValidation.deleteCaptureLeadById),
    captureLeadController.deleteCaptureLeadById,
  );

router
  .route('/auth/meta')
  .get(
    userAuthAndCheckPermissions(),
    captureLeadController.authCompanyMetaAccount,
  );

router
  .route('/auth/meta/callback')
  .get(captureLeadController.authCompanyMetaAccountCallback);

export default router;
