import type { CaptchaChallengeRecord, VerifyCaptchaInput } from "./types.ts";

export function normalizeTextAnswer(value: unknown, caseSensitive: boolean): string {
  const normalized = String(value ?? "")
    .normalize("NFKC")
    .trim()
    .replace(/\s+/g, " ");
  return caseSensitive ? normalized : normalized.toUpperCase();
}

export function normalizeSelections(values: unknown): string {
  if (!Array.isArray(values)) return "";
  return [...new Set(values.map((value) => String(value).trim()).filter(Boolean))].sort().join(",");
}

export function normalizedSubmittedAnswer(
  record: CaptchaChallengeRecord,
  input: VerifyCaptchaInput,
): string {
  if (record.answerKind === "selections") return normalizeSelections(input.selections);
  if (record.answerKind === "invisible") {
    return JSON.stringify({
      honeypot: String(input.honeypot ?? ""),
      timingToken: String(input.timingToken ?? ""),
    });
  }
  return normalizeTextAnswer(input.answer, record.caseSensitive);
}
