import { digitsOnly } from '@/utils';

/** An Iranian IBAN (شبا) is `IR` + 24 digits. */
export const SHEBA_DIGIT_COUNT = 24;

/**
 * Normalizes user input to canonical `IR`+24-digit form: uppercases, strips spaces, drops a
 * leading `IR`, keeps ASCII digits (Persian/Arabic normalized), caps at 24. Partial input
 * yields fewer digits (so `isValidSheba` still fails).
 */
export function normalizeSheba(input: string): string {
  const raw = input.trim().toUpperCase().replace(/\s+/g, '');
  const withoutPrefix = raw.startsWith('IR') ? raw.slice(2) : raw;
  return `IR${digitsOnly(withoutPrefix).slice(0, SHEBA_DIGIT_COUNT)}`;
}

/** True when the input is a well-formed Sheba (`IR` + exactly 24 digits) after normalization. */
export function isValidSheba(input: string): boolean {
  return /^IR\d{24}$/.test(normalizeSheba(input));
}

// Bank identifier = the 3 digits after the 2 check digits (BBAN prefix). Reference data used
// to populate the add-body `bankName`; the returned DTO's bankName is authoritative for display.
const BANK_NAMES: Record<string, string> = {
  '011': 'بانک صنعت و معدن',
  '012': 'بانک ملت',
  '013': 'بانک رفاه کارگران',
  '014': 'بانک مسکن',
  '015': 'بانک سپه',
  '016': 'بانک کشاورزی',
  '017': 'بانک ملی ایران',
  '018': 'بانک تجارت',
  '019': 'بانک صادرات ایران',
  '021': 'پست بانک ایران',
  '053': 'بانک کارآفرین',
  '054': 'بانک پارسیان',
  '055': 'بانک اقتصاد نوین',
  '057': 'بانک پاسارگاد',
  '062': 'بانک آینده',
};

/** Best-effort bank name from the IBAN's 3-digit bank code; empty string when unknown. */
export function shebaBankName(input: string): string {
  const normalized = normalizeSheba(input);
  if (!/^IR\d{24}$/.test(normalized)) return '';
  const bankCode = normalized.slice(4, 7);
  return BANK_NAMES[bankCode] ?? '';
}
