import { setAuditFields } from '@/shared/middleware/setAuditFields';
import validate from '@/shared/utils/middlewares/validate.middleware';
import express, { Router } from 'express';
import userAuthAndCheckPermissions from '../auth/auth.user.middleware';
import * as individualPropertiesController from './individualProperties.controller';
import individualPropertiesValidation from './individualProperties.validation';
import propertyFilesRoute from './files/files.route';

const router: Router = express.Router();

router
  .route('/')
  .post(
    userAuthAndCheckPermissions(),
    // validate(individualPropertiesValidation.createPrimaryProperty),
    setAuditFields({ mode: 'create', companyField: 'companyId' }),
    individualPropertiesController.createIndividualProperties,
  )
  .get(
    userAuthAndCheckPermissions(),
    validate(individualPropertiesValidation.getPrimaryProperties),
    individualPropertiesController.getIndividualPropertiesList,
  );

router
  .route('/generate-name-description')
  .post(
    userAuthAndCheckPermissions(),
    individualPropertiesController.generatePropertyNameAndDescription,
  );

router
  .route('/app')
  .get(
    userAuthAndCheckPermissions(),
    validate(individualPropertiesValidation.getPrimaryProperties),
    individualPropertiesController.getIndividualPropertiesAppList,
  );

router
  .route('/project-names')
  .get(
    userAuthAndCheckPermissions(),
    validate(individualPropertiesValidation.getProjectNamesFromProperties),
    individualPropertiesController.getProjectNamesFromProperties,
  );

router
  .route('/export')
  .get(
    userAuthAndCheckPermissions(),
    individualPropertiesController.exportIndividualProperties,
  );

router
  .route('/defaultFormValues')
  .get(
    userAuthAndCheckPermissions(),
    individualPropertiesController.defaultFormValues,
  );

router
  .route('/bulk-delete')
  .delete(
    userAuthAndCheckPermissions(),
    validate(individualPropertiesValidation.bulkDeletePrimaryProperty),
    individualPropertiesController.bulkDeleteIndividualProperties,
  );

router
  .route('/bulk-update-visibility')
  .patch(
    userAuthAndCheckPermissions(),
    validate(individualPropertiesValidation.bulkUpdatePropertyVisibility),
    individualPropertiesController.bulkUpdatePropertyVisibility,
  );

router
  .route('/bulk-update')
  .patch(
    userAuthAndCheckPermissions(),
    validate(individualPropertiesValidation.bulkUpdate),
    individualPropertiesController.bulkUpdate,
  );

router
  .route('/:propertyId')
  .get(
    userAuthAndCheckPermissions(),
    validate(individualPropertiesValidation.getPrimaryProperty),
    individualPropertiesController.getIndividualProperties,
  )
  .patch(
    userAuthAndCheckPermissions(),
    validate(individualPropertiesValidation.updatePrimaryProperty),
    setAuditFields({ mode: 'update', companyField: 'companyId' }),
    individualPropertiesController.updateIndividualProperties,
  )
  .delete(
    userAuthAndCheckPermissions(),
    validate(individualPropertiesValidation.deletePrimaryProperty),
    individualPropertiesController.deleteIndividualProperties,
  );

router
  .route('/:propertyId/prospects')
  .get(
    userAuthAndCheckPermissions(),
    validate(individualPropertiesValidation.getPrimaryProperty),
    individualPropertiesController.getProspects,
  );

router
  .route('/:propertyId/visitors')
  .get(
    userAuthAndCheckPermissions(),
    validate(individualPropertiesValidation.getPropertyVisitors),
    individualPropertiesController.getPropertyVisitors,
  );

router
  .route('/:propertyId/public')
  .get(
    validate(individualPropertiesValidation.getPrimaryProperty),
    individualPropertiesController.getIndividualProperties,
  );

router
  .route('/:propertyId/visibility')
  .get(
    userAuthAndCheckPermissions(),
    validate(individualPropertiesValidation.getPropertyVisibility),
    individualPropertiesController.getPropertyVisibility,
  )
  .put(
    userAuthAndCheckPermissions(),
    validate(individualPropertiesValidation.updatePropertyVisibility),
    setAuditFields({ mode: 'update', companyField: 'companyId' }),
    individualPropertiesController.updatePropertyVisibility,
  );

router
  .route('/:propertyId/source')
  .patch(
    userAuthAndCheckPermissions(),
    validate(individualPropertiesValidation.updatePropertySource),
    setAuditFields({ mode: 'update', companyField: 'companyId' }),
    individualPropertiesController.updatePropertySource,
  );

router.use('/:propertyId/files', propertyFilesRoute);

export default router;
