import type { Locale } from '../i18n/types';

/**
 * Dokument-Verifikation für Nachweise.
 *
 * Gedruckte Nachweise (Zertifikat, Schulungsregister) erhalten eine
 * SHA-256-Prüfsumme über den Dokumentinhalt. Damit lässt sich später
 * belegen, dass ein vorgelegter Ausdruck unverändert aus dem Tool
 * stammt: gleiche Eingaben ⇒ gleiche Prüfsumme. Hochgeladene Scans
 * werden ebenfalls gehasht und im Register verankert.
 */

/** Berechnet den SHA-256-Hash eines Textes als Hex-String. */
export async function sha256Hex(text: string): Promise<string> {
  const data = new TextEncoder().encode(text);
  const digest = await crypto.subtle.digest('SHA-256', data);
  return Array.from(new Uint8Array(digest))
    .map((b) => b.toString(16).padStart(2, '0'))
    .join('');
}

/** Berechnet den SHA-256-Hash von Binärdaten (z. B. Scan-Datei) als Hex-String. */
export async function sha256HexBytes(data: ArrayBuffer): Promise<string> {
  const digest = await crypto.subtle.digest('SHA-256', data);
  return Array.from(new Uint8Array(digest))
    .map((b) => b.toString(16).padStart(2, '0'))
    .join('');
}

const VERIFY_TEXT: Readonly<Record<'de' | 'en', { label: string; note: string }>> = {
  de: {
    label: 'Dokument-Prüfsumme (SHA-256)',
    note: 'Verifikation: Die Prüfsumme wurde über den vorstehenden Dokumentinhalt gebildet. Ein vorgelegter Ausdruck ist unverändert, wenn die im Tool neu erzeugte Prüfsumme übereinstimmt.',
  },
  en: {
    label: 'Document checksum (SHA-256)',
    note: 'Verification: the checksum was computed over the document content above. A presented printout is unaltered if the checksum re-generated in the tool matches.',
  },
};

/**
 * Hängt eine Verifikations-Fußzeile (Prüfsumme über den Inhalt) an ein
 * generiertes Markdown-Dokument an.
 *
 * @param markdown - Fertiges Dokument
 * @param locale - Dokumentsprache (Fußzeile DE/EN)
 * @returns Dokument mit Prüfsummen-Fußzeile
 */
export async function withVerification(markdown: string, locale: Locale): Promise<string> {
  const t = locale === 'de' ? VERIFY_TEXT.de : VERIFY_TEXT.en;
  const hash = await sha256Hex(markdown);
  return `${markdown}\n\n**${t.label}:** \`${hash}\`\n\n> ${t.note}`;
}
