import type { NextFunction, Request, Response } from "express";
import { ZodError, type ZodType } from "zod";
import { ApiError } from "../utils/asyncHandler.js";

export function validate(schema: ZodType) {
  return (req: Request, _res: Response, next: NextFunction) => {
    try {
      const parsed = schema.parse({
        body: req.body,
        query: req.query,
        params: req.params,
      });
      if (parsed.body !== undefined) req.body = parsed.body;
      if (parsed.query !== undefined) req.query = parsed.query;
      next();
    } catch (err) {
      if (err instanceof ZodError) {
        const messages = err.issues.map((i) => `${i.path.join(".")}: ${i.message}`);
        next(new ApiError(400, messages.join("; ")));
      } else {
        next(err);
      }
    }
  };
}
