import { Response } from "express";
import { ZodError } from "zod";

class ResponseUtil {
  static successResponse(
    res: Response,
    statusCode: number,
    data = {},
    message: string = ""
  ) {
    res.status(statusCode).json({
      status: statusCode,
      data,
      success: true,
      message,
    });
  }

  static errorResponse(res: Response, statusCode: number, message: string, data = {}) {
    res.status(statusCode).json({
      statusCode: statusCode,
      success: false,
      data: data,
      message,
    });
  }

  static handleError(res: Response, err: any) {
    if (err instanceof ZodError) {
      const errorMessage: any = err.errors.map((er) => ({
        field: er.path.join("."),
        message: er.message,
      }));
      return ResponseUtil.errorResponse(res, 400, errorMessage);
    } else if (err?.name === "ValidationError") {
      const fields = Object.values(err.errors || {}).map((e: any) => ({
        field: e.path,
        message: e.message,
      }));
      return ResponseUtil.errorResponse(res, 400, fields.length ? fields : err.message);
    } else if (err?.code === 11000) {
      const duplicateField = Object.keys(err.keyPattern || {})[0] || "field";
      return ResponseUtil.errorResponse(
        res,
        409,
        `${duplicateField} already exists`,
        { duplicateField, keyValue: err.keyValue || {} }
      );
    } else if (err?.name === "CastError") {
      return ResponseUtil.errorResponse(res, 400, `${err.path} is invalid`);
    } else {
      return ResponseUtil.errorResponse(
        res,
        500,
        err.message || "Internal server error"
      );
    }
  }
}

export default ResponseUtil;
