import { Request, Response } from 'express';

import catchAsync from '@/shared/utils/catchAsync';
import * as sourceService from '@/modules/master/constructionStatus/source/source.service';
import responseCodes from '@/shared/utils/responseCode/responseCode';
import { pick } from '@/shared/utils';
import { UserType } from '@/shared/constants/enum.constant';

const { SourceResponseCodes } = responseCodes;

export const create = catchAsync(async (req: Request, res: Response) => {
  const { user } = req;

  req.body.company = user.company.id;
  req.body.isDefault = user.userType === UserType.SUPERADMIN;

  const result = await sourceService.create(req.body);

  res.success(
    result,
    SourceResponseCodes.SUCCESS,
    'Source Created Successfully',
  );
});

export const get = catchAsync(async (req: Request, res: Response) => {
  const result = await sourceService.getById(req.params.id);
  res.success(
    result,
    SourceResponseCodes.SUCCESS,
    'Source Fetched Successfully',
  );
});

export const update = catchAsync(async (req: Request, res: Response) => {
  await sourceService.update(req.params.id, req.body);
  res.success(true, SourceResponseCodes.SUCCESS, 'Source Updated Successfully');
});

export const remove = catchAsync(async (req: Request, res: Response) => {
  await sourceService.remove(req.params.id);
  res.success(true, SourceResponseCodes.SUCCESS, 'Source Deleted Successfully');
});

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

  if (!filters.company) filters.company = req.user.company.id;

  const result = await sourceService.querySource(filters, options);
  res.success(
    result,
    SourceResponseCodes.SUCCESS,
    'Source Fetched Successfully',
  );
});
