import type { Locale } from "../i18n/config";

// Produktdaten kommen seit 02.08.2026 aus src/content/products/*.json — eine Datei pro
// Produkt. Diese JSON-Dateien werden im Admin-Bereich (/admin/, Sveltia CMS) von VanVan
// bearbeitet: neues Foto hochladen, Text ändern, Preis anpassen, fertig — kein Code nötig.
// `import.meta.glob(..., { eager: true })` lädt sie zur Build-Zeit synchron ein, damit sich
// an der bestehenden API dieser Datei (products-Array + Helper-Funktionen) nichts ändert —
// alle Seiten, die von hier importieren, funktionieren unverändert weiter.

export type Badge = "neu" | "bestseller" | "sale" | "handgemacht";

type LocalizedText = Record<Locale, string>;

// Eine einzelne Kundenrezension zu einem Produkt — von VanVan im Adminbereich gepflegt (echte
// Kunden-Rückmeldungen, KEINE automatisch erzeugten/erfundenen Bewertungen: Fake-Bewertungen sind
// in Deutschland/der EU seit der Omnibus-Richtlinie ausdrücklich verboten). Deshalb startet jedes
// Produkt ohne Bewertungen — die Anzeige blendet sich überall automatisch ein, sobald die erste
// echte Rezension eingetragen wird, und bleibt sonst dezent (kein "0 Bewertungen"-Ballast).
export interface Bewertung {
  name: string;
  bewertung: number; // 1–5 (Herzen statt Sterne, siehe HeartRating.astro)
  text?: LocalizedText;
  datum?: string; // ISO-Datum, z.B. "2026-08-03"
}

export interface Product {
  slug: string;
  name: LocalizedText;
  artikelnummer?: string;
  kategorie: string; // slug aus categories.ts
  unterkategorie?: string; // optionaler Unterkategorie-Slug aus categories.ts (z.B. "hase")
  // Ordnet das Produkt einem bestimmten Charakter innerhalb der Unterkategorie zu (z.B. "hasidog"
  // innerhalb der Unterkategorie "hase") — so weiß die Seite, welches Foto/welcher Text zu
  // welchem Charakter gehört. Leer lassen, wenn die Unterkategorie nur einen Charakter hat.
  charakter?: string;
  preis: number; // in Euro
  preisAlt?: number; // falls Sale
  bestand: number; // 0 = ausverkauft, bleibt trotzdem sichtbar
  beschreibung: LocalizedText;
  material?: string;
  groesse?: string;
  farben?: string[];
  lieferumfang?: string;
  pflegehinweise?: string;
  lieferzeit?: string;
  badges: Badge[];
  bilder?: string[]; // Pfade zu Produktfotos, von VanVan im Admin-Bereich hochgeladen
  // Eigene Versandkosten je Land — gelten NUR, wenn genau 1 Stück dieses einen Produkts
  // gekauft wird (Einzelkauf). Bei mehreren Produkten/Stückzahlen greift stattdessen die
  // Versandkosten-Staffel (siehe src/data/versand.ts). Optional, damit Bestandsprodukte ohne
  // diese Angabe nicht kaputtgehen — dann greift automatisch die Staffel als Rückfalllösung.
  versand?: { de?: number; at?: number; ch?: number; lu?: number };
  // Rabatte — mehrere Arten gleichzeitig möglich (siehe src/data/rabatt.ts für die Logik):
  // 1. Prozent/Betrag-Rabatt, optional zeitlich befristet (läuft automatisch ab).
  // 2. Mengenrabatt-Staffel (ab X Stück Y% Rabatt), wird im Warenkorb automatisch angewendet.
  rabatt?: {
    prozent?: number; // z.B. 20 = 20% Rabatt auf den Preis
    betrag?: number; // Alternative zu prozent: fester Euro-Betrag Rabatt
    bis?: string; // ISO-Datum, z.B. "2026-12-31" — Rabatt gilt nur bis einschließlich diesem Tag
    mengenrabatt?: { abMenge: number; prozent: number }[];
  };
  bewertungen?: Bewertung[];
}

const modules = import.meta.glob("/src/content/products/*.json", { eager: true }) as Record<
  string,
  { default: Product }
>;

export const products: Product[] = Object.values(modules)
  .map((m) => m.default)
  .sort((a, b) => a.slug.localeCompare(b.slug));

export function getProduct(slug: string): Product | undefined {
  return products.find((p) => p.slug === slug);
}

export function productsByCategory(kategorie: string): Product[] {
  return products.filter((p) => p.kategorie === kategorie);
}

export function productsByUnterkategorie(kategorie: string, unterkategorie: string): Product[] {
  return products.filter((p) => p.kategorie === kategorie && p.unterkategorie === unterkategorie);
}

export function saleProducts(): Product[] {
  return products.filter((p) => p.badges.includes("sale") || p.preisAlt);
}

// Rezensions-Helfer — überall genutzt, wo eine Herzen-Bewertung angezeigt wird (Produktkarte,
// Produktseite, Shop-Filter/Sortierung, Startseiten-Kundenstimmen), damit die Rechenlogik nur an
// einer Stelle steht.
export function durchschnittsbewertung(product: Product): number | null {
  const b = product.bewertungen;
  if (!b || b.length === 0) return null;
  return b.reduce((sum, r) => sum + r.bewertung, 0) / b.length;
}

export function anzahlBewertungen(product: Product): number {
  return product.bewertungen?.length ?? 0;
}

// Alle Rezensionen über alle Produkte hinweg, neueste zuerst — Grundlage für die
// Kundenstimmen-Sektion auf der Startseite.
export function alleBewertungen(): (Bewertung & { produktSlug: string; produktName: LocalizedText })[] {
  return products
    .flatMap((p) => (p.bewertungen ?? []).map((b) => ({ ...b, produktSlug: p.slug, produktName: p.name })))
    .sort((a, b) => (b.datum ?? "").localeCompare(a.datum ?? ""));
}

// Gesamt-Durchschnitt über alle Produkte hinweg — für die Kundenstimmen-Sektion auf der
// Startseite (erscheint erst automatisch, sobald mindestens eine echte Bewertung existiert).
export function gesamtDurchschnitt(): number | null {
  const alle = alleBewertungen();
  if (alle.length === 0) return null;
  return alle.reduce((sum, r) => sum + r.bewertung, 0) / alle.length;
}
