// Partner-/Influencer-Rabattcodes — eigene Codes, die VanVan z.B. mit Streamer:innen oder
// Content-Creator:innen aushandelt: Kund:innen bekommen damit Rabatt beim Einkauf, während VanVan
// im Adminbereich für jeden Code hinterlegt, zu welcher Partnerin/welchem Partner er gehört (für
// die eigene Übersicht, z.B. welche vereinbarte Provision dahintersteckt).
//
// Fachlich fast identisch zu einem normalen Gutschein (Rabatt auf den Warenwert), aber bewusst als
// eigene, separate Liste geführt — allgemeine Rabattaktionen (Gutscheine) und individuell mit
// einzelnen Partner:innen ausgehandelte Codes sollen im Admin nicht durcheinandergeraten.
//
// WICHTIG (Grenze von Phase 1 — reine statische Seite ohne eigenes Backend): Diese Codes können
// einen Rabatt gewähren, aber es gibt (noch) keine automatische Zähl-/Provisions-Auswertung, WER
// wie oft welchen Code eingelöst hat — das bräuchte einen echten Server (Phase 2, siehe
// Tech-Stack-Entscheidung im Projekt-Vault). Bis dahin: das `notiz`-Feld im Admin dient VanVan als
// Gedächtnisstütze für die vereinbarten Konditionen.

// @ts-ignore -- JSON-Import, zur Build-Zeit von Astro/Vite aufgelöst
import partnercodesRaw from "../content/partnercodes.json";

export interface Partnercode {
  code: string;
  /** Name der Partnerin/des Partners (Streamer:in, Creator:in, ...) — nur für VanVans eigene
   *  Übersicht im Admin, wird Kund:innen nirgends angezeigt. */
  partner: string;
  prozent?: number;
  betrag?: number;
  bis?: string; // ISO-Datum, optional
  /** Auf false setzen, um einen Code zu pausieren, ohne ihn (und die Partner-Historie) zu löschen. */
  aktiv?: boolean;
  /** Ob der Code auch auf Artikel gilt, die schon im Sale sind (preisAlt gesetzt ODER aktiver
   *  Prozent-/Betrags-Rabatt, siehe istImSale() in rabatt.ts). Standard: true (wie bisher — gilt
   *  auf alles). Auf false setzen, damit der Partner-Rabatt NICHT zusätzlich auf schon
   *  reduzierte Artikel obendrauf kommt, sondern nur auf regulär bepreiste Artikel im Warenkorb
   *  wirkt. */
  giltAufSale?: boolean;
}

const partnercodes = (partnercodesRaw as { codes: Partnercode[] }).codes ?? [];

function istGueltig(bis?: string): boolean {
  if (!bis) return true;
  return new Date() <= new Date(`${bis}T23:59:59`);
}

/** Sucht einen Partnercode anhand des eingegebenen Codes (Groß-/Kleinschreibung egal). Pausierte
 *  (aktiv: false) oder abgelaufene Codes gelten als nicht gefunden. */
export function findePartnercode(code: string): Partnercode | undefined {
  const normalisiert = code.trim().toUpperCase();
  return partnercodes.find(
    (c) => c.code.toUpperCase() === normalisiert && c.aktiv !== false && istGueltig(c.bis)
  );
}

/** Berechnet den Rabatt-Betrag in Euro für einen gegebenen Warenwert. */
export function partnercodeRabatt(code: Partnercode, warenwert: number): number {
  if (typeof code.prozent === "number" && code.prozent > 0) {
    return Math.min(warenwert, warenwert * (code.prozent / 100));
  }
  if (typeof code.betrag === "number" && code.betrag > 0) {
    return Math.min(warenwert, code.betrag);
  }
  return 0;
}
