import "server-only";
import type { z } from "zod";
import { getTranslations } from "next-intl/server";

/**
 * 将 Zod 校验失败的 fieldErrors 中的 i18n 键翻译为实际消息。
 *
 * schema.ts 中错误消息存储为 i18n 键（如 "error.titleRequired"），
 * 此函数在 actions 层调用，将键翻译为当前语言的文本。
 *
 * 返回类型为 Record<string, string[]>（不含 undefined），
 * 因为只有非 undefined 的字段才会被加入结果。
 */
export async function translateFieldErrors(
  errors: Record<string, string[] | undefined>,
): Promise<Record<string, string[]>> {
  const t = await getTranslations("lessonPreparation");
  const result: Record<string, string[]> = {};
  for (const [field, messages] of Object.entries(errors)) {
    if (!messages) continue;
    result[field] = messages.map((msg) => {
      // 仅翻译以 "error." 开头的 i18n 键，其他保持原样
      if (msg.startsWith("error.")) {
        // V4 P1-13 修复：next-intl 的 t 函数对键有字面量类型约束，
        // 动态字符串需断言为键类型。msg 已通过 startsWith 校验为合法 i18n 键前缀，
        // 此处 as 属于"从 string 收窄到字面量联合类型"的类型收窄，符合项目规则例外。
        return t(msg as Parameters<typeof t>[0]);
      }
      return msg;
    });
  }
  return result;
}

/**
 * 安全解析 Zod 结果并返回 ActionState 错误格式（带 i18n 翻译）。
 * 若校验失败，返回翻译后的 fieldErrors；若成功，返回 parsed.data。
 */
export async function safeParseWithI18n<T>(
  schema: z.ZodType<T>,
  input: unknown,
): Promise<
  | { success: true; data: T }
  | { success: false; errors: Record<string, string[]> }
> {
  const result = schema.safeParse(input);
  if (!result.success) {
    const errors = result.error.flatten().fieldErrors;
    const translated = await translateFieldErrors(errors);
    return { success: false, errors: translated };
  }
  return { success: true, data: result.data };
}
