// Rein clientseitige Kundenrezensionen (Phase 1, kein Backend) — im localStorage gespeichert,
// genau wie Warenkorb (cart.ts) und Konto (account.ts). Kund:innen schreiben ihre Rezension
// direkt auf der Produktseite; sie wird sofort auf dieser Seite UND (per gemeinsamem Skript,
// siehe reviews-live.ts) auf Produktkarten, im Shop-Filter und auf der Startseite berücksichtigt.
// TODO Phase 2: durch echte, für alle Besucher:innen sichtbare Rezensionen aus einer Datenbank
// ersetzen (Cloudflare Worker + D1) — bis dahin sieht jede Rezension nur die Person, die sie auf
// ihrem eigenen Gerät/Browser geschrieben hat, wichtig das VanVan gegenüber ehrlich zu kommunizieren.

import { getAccount, markiereBestellungBewertet, anzeigeName } from "./account";

export interface LokaleBewertung {
  name: string;
  bewertung: number; // 1–5
  text: string;
  datum: string; // ISO-Datum
  bestellnummer?: string;
}

/** Einheitliche Anzeige-Form, egal ob die Rezension von VanVan (Admin/Seed-Daten, mehrsprachig)
 *  oder von einer/einem Kund:in (lokal, eine Sprache) stammt — Produktkarten, Produktseite,
 *  Startseite rechnen nur noch mit dieser Form. */
export interface AnzeigeBewertung {
  name: string;
  bewertung: number;
  text?: string;
  datum?: string;
}

const KEY = "vandiy_reviews_v1";

function alle(): Record<string, LokaleBewertung[]> {
  if (typeof localStorage === "undefined") return {};
  try {
    return JSON.parse(localStorage.getItem(KEY) || "{}");
  } catch {
    return {};
  }
}

function speichereAlle(map: Record<string, LokaleBewertung[]>) {
  localStorage.setItem(KEY, JSON.stringify(map));
  window.dispatchEvent(new CustomEvent("reviews:changed", { detail: map }));
}

export function lokaleBewertungenFuer(slug: string): LokaleBewertung[] {
  return alle()[slug] ?? [];
}

/** Slugs aller Produkte, zu denen auf diesem Gerät schon eine Rezension geschrieben wurde —
 *  Grundlage für die Startseiten-Kundenstimmen, wenn (noch) keine Admin-Rezensionen existieren. */
export function alleLokalenSlugs(): string[] {
  return Object.entries(alle())
    .filter(([, liste]) => liste.length > 0)
    .map(([slug]) => slug);
}

export function fuegeBewertungHinzu(
  slug: string,
  eintrag: { bewertung: number; text: string; bestellnummer?: string; name?: string }
): LokaleBewertung {
  const account = getAccount();
  const neu: LokaleBewertung = {
    name: eintrag.name?.trim() || anzeigeName(account) || "Anonym",
    bewertung: Math.min(5, Math.max(1, Math.round(eintrag.bewertung))),
    text: eintrag.text.trim(),
    datum: new Date().toISOString().slice(0, 10),
    bestellnummer: eintrag.bestellnummer,
  };
  const map = alle();
  map[slug] = [neu, ...(map[slug] ?? [])];
  speichereAlle(map);
  if (eintrag.bestellnummer) markiereBestellungBewertet(eintrag.bestellnummer, slug);
  return neu;
}

/** Führt die vom Server mitgelieferten (Admin/Seed-)Bewertungen mit den lokal auf diesem Gerät
 *  gespeicherten zusammen — neueste zuerst. `serverText` bekommt schon die richtige Sprache
 *  übergeben (Produkt-JSON ist mehrsprachig, lokale Kundentexte nicht). */
export function bewertungenZusammenfuehren(
  serverBewertungen: { name: string; bewertung: number; text?: string; datum?: string }[],
  slug: string
): AnzeigeBewertung[] {
  const lokal: AnzeigeBewertung[] = lokaleBewertungenFuer(slug).map((b) => ({
    name: b.name,
    bewertung: b.bewertung,
    text: b.text,
    datum: b.datum,
  }));
  const server: AnzeigeBewertung[] = serverBewertungen.map((b) => ({ ...b }));
  return [...lokal, ...server].sort((a, b) => (b.datum ?? "").localeCompare(a.datum ?? ""));
}

export function durchschnitt(bewertungen: { bewertung: number }[]): number | null {
  if (bewertungen.length === 0) return null;
  return bewertungen.reduce((sum, b) => sum + b.bewertung, 0) / bewertungen.length;
}
