import { z } from 'zod';

/**
 * Cria um schema Zod para o padrão de resposta da API.
 * Valida respostas no formato { success: boolean, data: T, message?: string }.
 *
 * @param {z.ZodTypeAny} dataSchema - Schema Zod para validar o campo data
 * @returns {z.ZodObject} Schema completo da resposta da API
 */
export const createApiSchema = <T extends z.ZodTypeAny>(dataSchema: T) => {
  return z.object({
    success: z.boolean(),
    data: dataSchema,
    message: z.string().optional(),
  });
};

/**
 * Extrai e valida dados de uma resposta da API de forma segura.
 * Usa Zod para validação em runtime e retorna fallback em caso de erro.
 *
 * @param {any} response - A resposta da API (objeto Axios response)
 * @param {z.ZodType<T>} schema - Schema Zod para validar a resposta
 * @param {T} fallback - Valor de fallback se validação falhar
 * @returns {T} Os dados validados ou o fallback
 */
export const unwrapApiData = <T>(
  response: { data?: unknown } | undefined,
  schema: z.ZodType<{ success: boolean; data: T }>,
  fallback: T
): T => {
  const result = schema.safeParse(response?.data);
  return result.success && result.data.success ? result.data.data : fallback;
};
