const ONES = ["", "یک", "دو", "سه", "چهار", "پنج", "شش", "هفت", "هشت", "نه"];
const TEENS = [
  "ده",
  "یازده",
  "دوازده",
  "سیزده",
  "چهارده",
  "پانزده",
  "شانزده",
  "هفده",
  "هجده",
  "نوزده",
];
const TENS = ["", "", "بیست", "سی", "چهل", "پنجاه", "شصت", "هفتاد", "هشتاد", "نود"];
const HUNDREDS = ["", "صد", "دویست", "سیصد", "چهارصد", "پانصد", "ششصد", "هفتصد", "هشتصد", "نهصد"];
const SCALES = ["", "هزار", "میلیون", "میلیارد", "تریلیون"];

function threeDigitsToWords(n: number): string {
  if (n === 0) return "";
  const parts: string[] = [];
  const h = Math.floor(n / 100);
  const t = n % 100;
  if (h) parts.push(HUNDREDS[h]);
  if (t >= 10 && t < 20) {
    parts.push(TEENS[t - 10]);
  } else {
    const ten = Math.floor(t / 10);
    const one = t % 10;
    if (ten) parts.push(TENS[ten]);
    if (one) parts.push(ONES[one]);
  }
  return parts.join(" و ");
}

/** Convert non-negative integer to Persian words. */
export function numberToPersianWords(value: number): string {
  if (!Number.isFinite(value) || value < 0) return "";
  const n = Math.floor(value);
  if (n === 0) return "صفر";

  const parts: string[] = [];
  let remaining = n;
  let scale = 0;
  while (remaining > 0 && scale < SCALES.length) {
    const chunk = remaining % 1000;
    if (chunk) {
      const words = threeDigitsToWords(chunk);
      const scaleLabel = SCALES[scale];
      parts.unshift(scaleLabel ? `${words} ${scaleLabel}` : words);
    }
    remaining = Math.floor(remaining / 1000);
    scale += 1;
  }
  return parts.join(" و ");
}

export function parseMoneyDigits(raw: string): string {
  return raw.replace(/[^\d]/g, "");
}

export function formatMoneyDisplay(digits: string): string {
  if (!digits) return "";
  return digits.replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}

export function moneyDigitsToNumber(digits: string): number {
  if (!digits) return 0;
  return Number(digits) || 0;
}

export function moneyToWordsLabel(digits: string, unit = "ریال"): string {
  const n = moneyDigitsToNumber(digits);
  if (!digits) return "";
  return `${numberToPersianWords(n)} ${unit}`;
}
