// Rundet auf Cent und verhindert einen negativen Endbetrag, falls ein
// Rabatt (versehentlich) größer als der vereinbarte Preis ist.
export function getPayableAmount(baseAmount: number, discountAmount: number): number {
  return Math.max(0, Math.round((baseAmount - (discountAmount || 0)) * 100) / 100);
}

export function computeDiscountAmount(type: "percent" | "fixed", value: number, baseAmount: number): number {
  const raw = type === "percent" ? (baseAmount * value) / 100 : value;
  return Math.min(Math.max(0, Math.round(raw * 100) / 100), baseAmount);
}

// Code-Rabatt, manueller Rabatt und eingesetztes Kontoguthaben sind additiv,
// aber getrennt gespeichert (siehe Order-Model) — überall dort, wo der
// tatsächlich zu zahlende Betrag berechnet wird, müssen alle drei
// zusammengezählt werden. Guthaben wirkt hier bewusst wie ein Rabatt (statt
// separat verbucht) — es mindert sowohl den zu zahlenden Betrag als auch den
// ausgewiesenen Umsatz, da es i. d. R. selbst nicht aus einer echten
// Kundenzahlung stammt (Empfehlungsprämie, Storno-Rückerstattung).
export function getTotalOrderDiscount(order: {
  discountAmount?: number;
  manualDiscountAmount?: number;
  creditApplied?: number;
}): number {
  return (order.discountAmount || 0) + (order.manualDiscountAmount || 0) + (order.creditApplied || 0);
}
