import { ApiClientError } from "@/lib/frontend/apiClient";

const DEFAULT_GENERIC = Object.freeze({
	kind: "generic",
	title: "Fehler",
	description:
		"Beim Laden der Suche ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.",
});

const DEFAULT_VALIDATION = Object.freeze({
	kind: "validation",
	title: "Ungültige Eingabe",
	description: "Bitte prüfen Sie Ihre Eingaben und versuchen Sie es erneut.",
});

const VALIDATION_MAP = Object.freeze({
	VALIDATION_SEARCH_MISSING_FILTER: {
		title: "Kein Suchbegriff",
		description: "Bitte geben Sie einen Suchbegriff ein.",
	},
	VALIDATION_SEARCH_BRANCH: {
		title: "Niederlassung fehlt",
		description: "Bitte wählen Sie eine Niederlassung aus.",
	},
	VALIDATION_SEARCH_BRANCHES: {
		title: "Niederlassungen fehlen",
		description: "Bitte wählen Sie mindestens eine Niederlassung aus.",
	},
	VALIDATION_SEARCH_SCOPE: {
		title: "Ungültiger Suchbereich",
		description: "Bitte wählen Sie einen gültigen Suchbereich aus.",
	},
	VALIDATION_SEARCH_LIMIT: {
		title: "Ungültige Seitengröße",
		description:
			"Die Anzahl der Ergebnisse pro Seite ist ungültig. Bitte versuchen Sie es erneut.",
	},
	VALIDATION_SEARCH_CURSOR: {
		title: "Ungültige Paginierung",
		description:
			"Die nächsten Ergebnisse konnten nicht geladen werden. Bitte starten Sie die Suche erneut.",
	},
	VALIDATION_SEARCH_DATE: {
		title: "Ungültiger Zeitraum",
		description: "Bitte prüfen Sie den Zeitraum und versuchen Sie es erneut.",
	},
	VALIDATION_SEARCH_RANGE: {
		title: "Ungültiger Zeitraum",
		description: "Das Startdatum darf nicht nach dem Enddatum liegen.",
	},
});

/**
 * mapSearchError
 *
 * Centralized error-to-UI mapping for Search UI (RHL-024).
 *
 * Important:
 * - All returned strings are user-facing => German.
 * - We intentionally do NOT expose raw backend messages to the UI.
 *
 * @param {unknown} err
 * @returns {null | {
 *   kind: "unauthenticated"|"forbidden"|"validation"|"generic",
 *   title: string,
 *   description: string
 * }}
 */
export function mapSearchError(err) {
	if (!err) return null;

	if (err instanceof ApiClientError) {
		if (err.code === "AUTH_UNAUTHENTICATED") {
			return {
				kind: "unauthenticated",
				title: "Sitzung abgelaufen",
				description:
					"Ihre Sitzung ist abgelaufen. Sie werden zum Login weitergeleitet.",
			};
		}

		if (err.code === "AUTH_FORBIDDEN_BRANCH") {
			return {
				kind: "forbidden",
				title: "Kein Zugriff",
				description:
					"Sie haben keine Berechtigung, diesen Suchbereich zu verwenden.",
			};
		}

		if (String(err.code || "").startsWith("VALIDATION_")) {
			const mapped = VALIDATION_MAP[err.code];

			return {
				kind: "validation",
				title: mapped?.title || DEFAULT_VALIDATION.title,
				description: mapped?.description || DEFAULT_VALIDATION.description,
			};
		}

		if (err.code === "CLIENT_NETWORK_ERROR") {
			return {
				kind: "generic",
				title: "Netzwerkfehler",
				description:
					"Bitte prüfen Sie Ihre Verbindung und versuchen Sie es erneut.",
			};
		}

		return DEFAULT_GENERIC;
	}

	return DEFAULT_GENERIC;
}
