/**
 * Auth error vocabulary shared by the API routes and the UI.
 *
 * The server only ever emits these codes; all wording lives here so both
 * languages stay in one place and route handlers hold no copy. Dependency-free
 * on purpose — this module is imported by client components.
 */

export type AuthErrorCode =
  // Emitted by the JSON endpoints.
  | "invalid_request"
  | "invalid_email"
  | "disposable_email"
  | "weak_password"
  // Legacy codes that used to reveal account existence. They stay in the
  // vocabulary for compatibility (stale clients, old messages), but no auth
  // route may emit them anymore — see src/lib/auth/neutral.ts.
  | "email_taken"
  | "email_taken_google"
  | "invalid_credentials"
  | "use_google"
  | "email_not_verified"
  | "invalid_token"
  | "expired_token"
  | "rate_limited"
  | "mail_failed"
  | "database_unavailable"
  | "server_error"
  | "csrf_failed"
  | "unauthorized"
  | "wrong_password"
  | "confirmation_mismatch"
  // Arrive as `?error=` on the redirect back from the OAuth callback.
  | "google_not_configured"
  | "google_denied"
  | "google_unverified_email"
  | "google_failed";

const MESSAGES: Record<AuthErrorCode, { de: string; en: string }> = {
  invalid_request: {
    de: "Bitte fülle alle Felder aus.",
    en: "Please fill in every field.",
  },
  invalid_email: {
    de: "Diese E-Mail-Adresse sieht nicht gültig aus.",
    en: "That email address doesn't look valid.",
  },
  disposable_email: {
    de: "Wegwerf-Adressen sind nicht erlaubt. Bitte nutze eine echte E-Mail-Adresse.",
    en: "Disposable addresses aren't accepted. Please use a real email address.",
  },
  weak_password: {
    de: "Passwort zu schwach — mindestens 8 Zeichen, kombiniert mit Ziffern oder Sonderzeichen.",
    en: "Password too weak — at least 8 characters, mixed with digits or symbols.",
  },
  /** @deprecated Never emitted by any auth route — kept for vocabulary compatibility. */
  email_taken: {
    de: "Für diese E-Mail-Adresse existiert bereits ein Konto. Melde dich stattdessen an.",
    en: "An account with this email already exists. Sign in instead.",
  },
  /** @deprecated Never emitted by any auth route — kept for vocabulary compatibility. */
  email_taken_google: {
    de: "Diese E-Mail-Adresse ist mit Google verknüpft. Nutze „Mit Google fortfahren“.",
    en: "This email is linked to Google. Use “Continue with Google”.",
  },
  invalid_credentials: {
    de: "E-Mail-Adresse oder Passwort ist falsch.",
    en: "That email or password is incorrect.",
  },
  /** @deprecated Never emitted by any auth route — kept for vocabulary compatibility. */
  use_google: {
    de: "Dieses Konto nutzt Google-Anmeldung. Nutze „Mit Google fortfahren“.",
    en: "This account signs in with Google. Use “Continue with Google”.",
  },
  email_not_verified: {
    de: "Bitte bestätige zuerst deine E-Mail-Adresse.",
    en: "Please confirm your email address first.",
  },
  invalid_token: {
    de: "Dieser Link ist ungültig oder wurde bereits benutzt. Fordere einen neuen an.",
    en: "This link is invalid or was already used. Request a new one.",
  },
  expired_token: {
    de: "Dieser Link ist abgelaufen. Fordere einen neuen an.",
    en: "This link has expired. Request a new one.",
  },
  rate_limited: {
    de: "Zu viele Versuche. Bitte versuche es später erneut.",
    en: "Too many attempts. Please try again later.",
  },
  mail_failed: {
    de: "Die Bestätigungs-E-Mail konnte nicht gesendet werden. Bitte versuche es später erneut.",
    en: "We couldn't send the confirmation email. Please try again later.",
  },
  database_unavailable: {
    de: "Anmeldung ist gerade nicht möglich (keine Datenbankverbindung). Bitte versuche es später erneut.",
    en: "Sign-in is unavailable right now (no database connection). Please try again later.",
  },
  server_error: {
    de: "Etwas ist schiefgelaufen. Bitte versuche es erneut.",
    en: "Something went wrong. Please try again.",
  },
  csrf_failed: {
    de: "Sicherheitsprüfung fehlgeschlagen. Bitte lade die Seite neu und versuche es erneut.",
    en: "Security check failed. Please reload the page and try again.",
  },
  unauthorized: {
    de: "Bitte melde dich an, um diese Aktion auszuführen.",
    en: "Please sign in to perform this action.",
  },
  wrong_password: {
    de: "Das aktuelle Passwort ist nicht korrekt.",
    en: "The current password is incorrect.",
  },
  confirmation_mismatch: {
    de: "Die eingegebene E-Mail-Adresse stimmt nicht mit deinem Konto überein.",
    en: "The email you typed doesn't match your account.",
  },
  google_not_configured: {
    de: "Google-Anmeldung ist auf diesem Server nicht konfiguriert.",
    en: "Google sign-in isn't configured on this server.",
  },
  google_denied: {
    de: "Google-Anmeldung wurde abgebrochen.",
    en: "Google sign-in was cancelled.",
  },
  google_unverified_email: {
    de: "Google hat diese E-Mail-Adresse nicht bestätigt.",
    en: "Google hasn't confirmed that email address.",
  },
  google_failed: {
    de: "Google-Anmeldung fehlgeschlagen. Bitte versuche es erneut.",
    en: "Google sign-in failed. Please try again.",
  },
};

export function isAuthErrorCode(value: unknown): value is AuthErrorCode {
  return typeof value === "string" && value in MESSAGES;
}

export function authErrorMessage(
  code: string | null | undefined,
  isDe: boolean,
  retryAfterSeconds?: number
): string {
  if (!isAuthErrorCode(code)) {
    return isDe ? MESSAGES.server_error.de : MESSAGES.server_error.en;
  }

  if (code === "rate_limited" && retryAfterSeconds && retryAfterSeconds > 0) {
    const minutes = Math.ceil(retryAfterSeconds / 60);
    return isDe
      ? `Zu viele Versuche. Bitte warte ${minutes} Minute${minutes === 1 ? "" : "n"}.`
      : `Too many attempts. Please wait ${minutes} minute${minutes === 1 ? "" : "s"}.`;
  }

  return isDe ? MESSAGES[code].de : MESSAGES[code].en;
}
