export type RegistrationPricingInput = {
  classDetails: Record<string, unknown>;
  paymentStep?: Record<string, unknown>;
  invoiceTotal?: number;
  discountAmount?: number;
};

export type RegistrationPricingSummary = {
  perUnitPrice: number;
  lessonCount: number;
  totalClassValue: number;
  amountPaid: number;
  paymentFrequencyLabel: string;
  priceSuffix: string;
  couponCode: string;
};

const FREQUENCY_LABELS: Record<string, string> = {
  weekly: "Weekly",
  monthly: "Monthly",
  daily: "Daily",
  per_lesson: "Per lesson",
};

import { roundMoney } from "./money";

export { roundMoney } from "./money";

export function formatMoney(n: number): string {
  const rounded = roundMoney(n);
  return Number.isInteger(rounded) ? rounded.toString() : rounded.toFixed(2);
}

/** Sidebar / card heading from API `fee_basis` (e.g. per_month, per_lesson). */
export function getFeeBasisPriceLabel(feeBasis?: string): string {
  const basis = String(feeBasis || "per_lesson").toLowerCase();
  if (basis === "per_month" || basis === "monthly" || basis.includes("month")) {
    return "Price per month";
  }
  if (basis === "per_week" || basis === "weekly" || basis.includes("week")) {
    return "Price per week";
  }
  if (basis === "per_day" || basis === "daily" || basis.includes("day")) {
    return "Price per day";
  }
  if (basis === "per_class" || basis.includes("class")) {
    return "Price per class";
  }
  return "Price per lesson";
}

export function resolvePriceSuffix(classDetails: Record<string, unknown>): string {
  const feeBasis = String(classDetails.price_name || classDetails.fee_basis || "per_lesson").toLowerCase();
  if (feeBasis.includes("month")) return "per month";
  if (feeBasis.includes("week")) return "per week";
  return "per lesson";
}

export function resolvePaymentFrequencyLabel(
  classDetails: Record<string, unknown>,
  paymentStep?: Record<string, unknown>
): string {
  const raw = String(
    paymentStep?.payment_charges_frequency ||
      classDetails.payment_charges_frequency ||
      ""
  ).toLowerCase();
  if (!raw) return "";
  return FREQUENCY_LABELS[raw] || raw.replace(/_/g, " ");
}

export function resolveRegistrationPricing(input: RegistrationPricingInput): RegistrationPricingSummary {
  const { classDetails, paymentStep = {}, invoiceTotal, discountAmount = 0 } = input;

  const perUnitPrice = roundMoney(
    parseFloat(String(classDetails.value ?? classDetails.price ?? "0"))
  );
  const lessonCount =
    parseInt(String(classDetails.number_of_lessons || "1"), 10) || 1;

  const storedTotalClass = roundMoney(
    parseFloat(String(paymentStep.total_class_value ?? classDetails.total_class_value ?? "0"))
  );
  const computedClassTotal = roundMoney(
    Math.max(0, perUnitPrice * lessonCount - roundMoney(discountAmount))
  );
  const totalClassValue = storedTotalClass > 0 ? storedTotalClass : computedClassTotal;

  const amountFromStep = roundMoney(parseFloat(String(paymentStep.amount_due_now ?? "0")));
  const amountPaid =
    invoiceTotal !== undefined && invoiceTotal > 0
      ? roundMoney(invoiceTotal)
      : amountFromStep > 0
        ? amountFromStep
        : 0;

  const couponCode = String(
    paymentStep.coupon_code ?? classDetails.coupon_code ?? ""
  );

  return {
    perUnitPrice,
    lessonCount,
    totalClassValue,
    amountPaid,
    paymentFrequencyLabel: resolvePaymentFrequencyLabel(classDetails, paymentStep),
    priceSuffix: resolvePriceSuffix(classDetails),
    couponCode,
  };
}
