import type { NextFunction, Request, Response } from "express";
import type { ZodType } from "zod";
import { badRequest } from "../lib/errors.js";

export function validateBody<T>(schema: ZodType<T>) {
  return (req: Request, _res: Response, next: NextFunction): void => {
    const result = schema.safeParse(req.body);
    if (!result.success) {
      const issues = result.error.issues.map((i) => `${i.path.join(".") || "body"}: ${i.message}`);
      return next(badRequest(`بيانات غير صالحة — ${issues.join(" | ")}`, "validation_error"));
    }
    req.body = result.data;
    next();
  };
}

export function validateQuery<T>(schema: ZodType<T>) {
  return (req: Request, res: Response, next: NextFunction): void => {
    const result = schema.safeParse(req.query);
    if (!result.success) {
      const issues = result.error.issues.map((i) => `${i.path.join(".") || "query"}: ${i.message}`);
      return next(badRequest(`معاملات غير صالحة — ${issues.join(" | ")}`, "validation_error"));
    }
    // Express 5 makes req.query read-only; expose parsed (with defaults applied) via locals
    res.locals.validatedQuery = result.data;
    next();
  };
}
