import { ZodError } from "zod";

export interface FormattedZodError {
  formErrors: string[];
  fieldErrors: Record<string, string[]>;
}

/**
 * Formats a ZodError to map errors to their corresponding field names.
 * Strips the top-level 'body', 'query', or 'params' keys to provide cleaner field names
 * when requests are validated via validate middleware.
 */
export function formatZodError(error: ZodError): FormattedZodError {
  const fieldErrors: Record<string, string[]> = {};
  const formErrors: string[] = [];

  for (const issue of error.issues) {
    const path = issue.path;
    if (path.length === 0) {
      formErrors.push(issue.message);
    } else {
      let key = path.join(".");

      // Strip 'body', 'query', or 'params' prefix if it is followed by nested fields
      if (
        path.length > 1 &&
        (path[0] === "body" || path[0] === "query" || path[0] === "params")
      ) {
        key = path.slice(1).join(".");
      }

      if (!fieldErrors[key]) {
        fieldErrors[key] = [];
      }
      fieldErrors[key].push(issue.message);
    }
  }

  return { formErrors, fieldErrors };
}
