import { Request, Response } from 'express';

import * as customFieldsService from '@/modules/customFields/customFields.service';
import catchAsync from '@/shared/utils/catchAsync';
import responseCodes from '@/shared/utils/responseCode/responseCode';
import { pick } from '@/shared/utils';

const { CustomFieldsResponseCodes } = responseCodes;

export const createCustomFields = catchAsync(
  async (req: Request, res: Response) => {
    const customFields = await customFieldsService.createCustomFields(req.body);
    res.success(
      customFields,
      CustomFieldsResponseCodes.SUCCESS,
      'CustomFields Created Successfully',
    );
  },
);

export const updateCustomFields = catchAsync(
  async (req: Request, res: Response) => {
    const { id } = pick(req.params, ['id']);

    const updatedCustomFields = await customFieldsService.updateCustomFields(
      id,
      req.body,
    );
    res.success(
      updatedCustomFields,
      CustomFieldsResponseCodes.SUCCESS,
      'CustomFields Updated Successfully',
    );
  },
);

export const deleteCustomFieldsById = catchAsync(
  async (req: Request, res: Response) => {
    const { id } = pick(req.params, ['id']);

    const customFields = await customFieldsService.deleteCustomFields(id);
    res.success(
      customFields,
      CustomFieldsResponseCodes.SUCCESS,
      'CustomFields Deleted Successfully',
    );
  },
);

export const getCustomFieldsById = catchAsync(
  async (req: Request, res: Response) => {
    const { id } = pick(req.params, ['id']);

    const customFieldss = await customFieldsService.getCustomFieldsById(id);

    res.success(
      customFieldss,
      CustomFieldsResponseCodes.SUCCESS,
      'CustomFields Fetched Successfully',
    );
  },
);

export const getCustomFields = catchAsync(
  async (req: Request, res: Response) => {
    const filter = pick(req.query, ['companyId', 'search', 'formName']);
    const options = pick(req.query, [
      'sortBy',
      'limit',
      'page',
      'populate',
      'includeTimeStamps',
      'fields',
    ]);

    const customFieldss = await customFieldsService.queryCustomFields(
      filter,
      options,
    );

    res.success(
      customFieldss,
      CustomFieldsResponseCodes.SUCCESS,
      'CustomFields Fetched Successfully',
    );
  },
);

export const updateCustomFieldsSequence = catchAsync(
  async (req: Request, res: Response) => {
    const { formName } = pick(req.params, ['formName']);
    const { companyId, sequence } = req.body;

    const updatedCustomFields =
      await customFieldsService.updateCustomFieldsSequence({
        companyId,
        formName,
        sequenceUpdates: sequence,
      });
    res.success(
      updatedCustomFields,
      CustomFieldsResponseCodes.SUCCESS,
      'CustomFields Updated Successfully',
    );
  },
);
