import { Request, Response } from 'express';
import * as activityService from './activity.service';
import catchAsync from '@/shared/utils/catchAsync';
import responseCodes from '@/shared/utils/responseCode/responseCode';
import { pick } from '@/shared/utils';
import { isValidDate } from '@/shared/utils/date';
import dayjs from 'dayjs';

const { ActivityResponseCodes } = responseCodes;

export const createActivity = catchAsync(async (req: Request, res: Response) => {
  const { company, id: userId } = req.user;

  const activity = await activityService.createActivity({
    ...req.body,
    company: company?.id,
    createdBy: userId,
  });

  res.success(activity, ActivityResponseCodes.SUCCESS, 'Activity Created Successfully');
});

export const getActivityById = catchAsync(async (req: Request, res: Response) => {
  const { id } = pick(req.params, ['id']);
  const activity = await activityService.getActivityById(id);
  res.success(activity, ActivityResponseCodes.SUCCESS, 'Activity Fetched Successfully');
});

export const updateActivity = catchAsync(async (req: Request, res: Response) => {
  const { id } = pick(req.params, ['id']);
  await activityService.updateActivity(id, req.body);
  res.success(true, ActivityResponseCodes.SUCCESS, 'Activity Updated Successfully');
});

export const deleteActivityById = catchAsync(async (req: Request, res: Response) => {
  const { id } = pick(req.params, ['id']);
  await activityService.deleteActivity(id);
  res.success(null, ActivityResponseCodes.SUCCESS, 'Activity Deleted Successfully');
});

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

  const result = await activityService.queryActivity(filter, options);

  if (result.results) {
    result.results = result.results.map((activity: any) => ({
      ...activity,
      scheduleDateTime: isValidDate(activity.scheduleDateTime)
        ? dayjs(activity.scheduleDateTime).toISOString()
        : null,
    }));
  }

  res.success(result, ActivityResponseCodes.SUCCESS, 'Activities Fetched Successfully');
});
