const IRAN_BANKS: Record<string, string> = {
  "010": "بانک مرکزی",
  "011": "بانک صنعت و معدن",
  "012": "بانک ملت",
  "013": "بانک رفاه کارگران",
  "014": "بانک مسکن",
  "015": "بانک سپه",
  "016": "بانک کشاورزی",
  "017": "بانک ملی ایران",
  "018": "بانک تجارت",
  "019": "بانک صادرات ایران",
  "020": "بانک توسعه صادرات",
  "021": "پست بانک ایران",
  "022": "بانک توسعه تعاون",
  "051": "موسسه اعتباری توسعه",
  "052": "بانک قوامین",
  "053": "بانک کارآفرین",
  "054": "بانک پارسیان",
  "055": "بانک اقتصاد نوین",
  "056": "بانک سامان",
  "057": "بانک پاسارگاد",
  "058": "بانک سرمایه",
  "059": "بانک سینا",
  "060": "بانک قرض‌الحسنه مهر ایران",
  "061": "بانک شهر",
  "062": "بانک آینده",
  "063": "بانک انصار",
  "064": "بانک گردشگری",
  "065": "بانک حکمت ایرانیان",
  "066": "بانک دی",
  "069": "بانک ایران زمین",
  "070": "بانک قرض‌الحسنه رسالت",
  "073": "بانک کوثر",
  "075": "بانک ملل",
  "078": "بانک خاورمیانه",
  "079": "بانک نور",
  "080": "بانک مهر اقتصاد",
};

export function stripShebaPrefix(value: string): string {
  const digits = value.replace(/\D/g, "");
  if (digits.length === 24) return digits;
  const upper = value.replace(/\s/g, "").toUpperCase();
  if (upper.startsWith("IR")) {
    return upper.slice(2).replace(/\D/g, "").slice(0, 24);
  }
  return digits.slice(0, 24);
}

function ibanMod97(iban: string): number {
  const rearranged = iban.slice(4) + iban.slice(0, 4);
  const expanded = rearranged
    .split("")
    .map((char) => {
      const code = char.charCodeAt(0);
      if (code >= 65 && code <= 90) return String(code - 55);
      return char;
    })
    .join("");

  let remainder = expanded;
  while (remainder.length > 2) {
    const block = remainder.slice(0, 9);
    remainder = String(parseInt(block, 10) % 97) + remainder.slice(block.length);
  }
  return parseInt(remainder, 10) % 97;
}

export function isValidIranSheba(digits24: string): boolean {
  if (!/^\d{24}$/.test(digits24)) return false;
  return ibanMod97(`IR${digits24}`) === 1;
}

export function getIranBankName(digits24: string): string | null {
  if (digits24.length < 5) return null;
  const bankCode = digits24.slice(2, 5);
  return IRAN_BANKS[bankCode] ?? null;
}

export function formatShebaForStorage(digits24: string): string {
  return `IR${digits24}`;
}
