// Versandkosten-Logik. Regeln (mit dem Nutzer am 02.08.2026 abgestimmt, Freigrenze am
// 03.08.2026 auf länderspezifische Werte umgestellt — die tatsächlichen Versandkosten
// unterscheiden sich je nach Land zu stark, um eine einzige Grenze für alle zu rechtfertigen):
// 1. Warenkorb-Gesamtwert >= länderspezifischer Freigrenze → Versand immer kostenlos, egal wie
//    viele Produkte/Stück (siehe FREIGRENZE_FALLBACK/freieVersandGrenze() unten).
// 2. Genau 1 Stück von genau 1 Produkt im Warenkorb → der am Produkt selbst hinterlegte
//    Versandpreis für das Zielland gilt (falls hinterlegt, sonst Fallback auf die Staffel).
// 3. Alles andere (mehrere Produkte und/oder mehrere Stück) → Versandkosten-Staffel nach
//    Gesamt-Warenwert für das Zielland (src/content/versandstaffel.json), von VanVan im
//    Adminbereich bearbeitbar.

import type { Product } from "./products";

export type CountryCode = "de" | "at" | "ch" | "lu";

export interface VersandStufe {
  abWarenwert: number;
  kosten: number;
}

export interface Versandstaffel {
  /** Versandkostenfreigrenze pro Land (€) — admin-editierbar, siehe config.yml "versandkosten". */
  freigrenze?: Record<CountryCode, number>;
  de: VersandStufe[];
  at: VersandStufe[];
  ch: VersandStufe[];
  lu: VersandStufe[];
}

// @ts-ignore -- JSON-Import, zur Build-Zeit von Astro/Vite aufgelöst
import versandstaffelRaw from "../content/versandstaffel.json";
export const versandstaffel = versandstaffelRaw as Versandstaffel;

// Rückfallwerte, falls im Adminbereich (noch) keine Freigrenze hinterlegt ist — die aktuell
// gültigen, mit VanVan abgestimmten Standardwerte (03.08.2026): Deutschland 75 €, Österreich/
// Luxemburg 85 €, Schweiz 100 € (höhere Versandkosten in die Schweiz rechtfertigen eine höhere
// Freigrenze).
const FREIGRENZE_FALLBACK: Record<CountryCode, number> = { de: 75, at: 85, ch: 100, lu: 85 };

/** Versandkostenfreigrenze (€) für ein bestimmtes Land — admin-editierbar (siehe
 *  versandstaffel.json "freigrenze"), fällt bei fehlendem/unvollständigem Wert auf die
 *  abgestimmten Standardwerte zurück. */
export function freieVersandGrenze(land: CountryCode): number {
  return versandstaffel.freigrenze?.[land] ?? FREIGRENZE_FALLBACK[land];
}

function tierLookup(land: CountryCode, warenwert: number): number {
  const stufen = versandstaffel[land] ?? [];
  const sortiert = [...stufen].sort((a, b) => a.abWarenwert - b.abWarenwert);
  let kosten = sortiert[0]?.kosten ?? 0;
  for (const s of sortiert) {
    if (warenwert >= s.abWarenwert) kosten = s.kosten;
  }
  return kosten;
}

export interface MinimalCartItem {
  slug: string;
  preis: number;
  menge: number;
}

/**
 * Berechnet die Versandkosten für einen Warenkorb in ein bestimmtes Land.
 * `alleProdukte` wird gebraucht, um bei Einzelkäufen den produktspezifischen Versandpreis
 * nachzuschlagen (die Cart-Items selbst kennen nur slug/preis/menge, keine Versanddaten).
 */
export function berechneVersandkosten(
  land: CountryCode,
  items: MinimalCartItem[],
  alleProdukte: Product[]
): number {
  if (items.length === 0) return 0;

  const warenwert = items.reduce((sum, i) => sum + i.preis * i.menge, 0);
  if (warenwert >= freieVersandGrenze(land)) return 0;

  const gesamtmenge = items.reduce((sum, i) => sum + i.menge, 0);
  const istEinzelkauf = items.length === 1 && gesamtmenge === 1;

  if (istEinzelkauf) {
    const produkt = alleProdukte.find((p) => p.slug === items[0].slug);
    const eigenerPreis = produkt?.versand?.[land];
    if (typeof eigenerPreis === "number") return eigenerPreis;
    // Kein eigener Versandpreis hinterlegt -> Staffel als Rückfalllösung
  }

  return tierLookup(land, warenwert);
}
