import { Request, Response, NextFunction } from "express";
import { ZodSchema, ZodError } from "zod";
import { respond } from "../shared/utils/apiResponse";

type ValidateTarget = "body" | "query" | "params";

export function validate(schema: ZodSchema, target: ValidateTarget = "body") {
  return (req: Request, res: Response, next: NextFunction): void => {
    const result = schema.safeParse(req[target]);

    if (!result.success) {
      const details = (result.error as ZodError).issues.map((e) => ({
        field: e.path.join("."),
        message: e.message,
      }));

      respond.badRequest(res, "Datos de entrada inválidos", details);
      return;
    }

    if (!res.locals.validated) {
      res.locals.validated = {};
    }

    res.locals.validated[target] = result.data;

    next();
  };
}
