import { Request, Response } from 'express';
import * as campaignService from '@/modules/campaign/campaign.service';
import catchAsync from '@/shared/utils/catchAsync';
import responseCodes from '@/shared/utils/responseCode/responseCode';
import { pick } from '@/shared/utils';

const { CampaignResponseCodes } = responseCodes;

export const createCampaign = catchAsync(
  async (req: Request, res: Response) => {
    const campaign = await campaignService.createCampaign(req.body);
    res.success(
      campaign,
      CampaignResponseCodes.SUCCESS,
      'Campaign Created Successfully',
    );
  },
);

export const updateCampaign = catchAsync(
  async (req: Request, res: Response) => {
    const { id } = pick(req.params, ['id']);
    const updatedCampaign = await campaignService.updateCampaign(id, req.body);
    res.success(
      updatedCampaign,
      CampaignResponseCodes.SUCCESS,
      'Campaign Updated Successfully',
    );
  },
);

export const deleteCampaignById = catchAsync(
  async (req: Request, res: Response) => {
    const { id } = pick(req.params, ['id']);
    const campaign = await campaignService.deleteCampaign(id);
    res.success(
      campaign,
      CampaignResponseCodes.SUCCESS,
      'Campaign Deleted Successfully',
    );
  },
);

export const getCampaignById = catchAsync(
  async (req: Request, res: Response) => {
    const { id } = pick(req.params, ['id']);
    const campaign = await campaignService.getCampaignById(id);
    res.success(
      campaign,
      CampaignResponseCodes.SUCCESS,
      'Campaign Fetched Successfully',
    );
  },
);

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

  if (filter.status)
    if (Array.isArray(filter.status)) filter.status = { $in: filter.status };
    else if (typeof filter.status === 'string' && filter.status.includes(','))
      filter.status = { $in: filter.status.split(',') };

  const campaigns = await campaignService.queryCampaigns(filter, options);
  res.success(
    campaigns,
    CampaignResponseCodes.SUCCESS,
    'Campaigns Fetched Successfully',
  );
});
