const ARABIC_DIACRITICS = /[\u064B-\u065F\u0670\u0640]/g

const AR_TO_EN_WORD = {
  محمد: 'Mohammad',
  احمد: 'Ahmad',
  محمود: 'Mahmoud',
  عبدالرحمن: 'Abdulrahman',
  عبدالله: 'Abdullah',
  عبدالله: 'Abdullah',
  عبدالاله: 'Abdulilah',
  عمر: 'Omar',
  علي: 'Ali',
  خالد: 'Khaled',
  خليل: 'Khalil',
  يزن: 'Yazan',
  يزيد: 'Yazeed',
  معاذ: 'Moaz',
  طارق: 'Tareq',
  زيد: 'Zaid',
  سامر: 'Samer',
  سيف: 'Saif',
  حسام: 'Hossam',
  باسم: 'Bassem',
  امجد: 'Amjad',
  مأمون: 'Maamoun',
  اياد: 'Eyad',
  إياد: 'Eyad',
  حمزة: 'Hamza',
  حمزه: 'Hamza',
  هيثم: 'Haitham',
  وائل: 'Wael',
  رائد: 'Raed',
  فهد: 'Fahad',
  فارس: 'Fares',
  ناصر: 'Nasser',
  جميل: 'Jameel',
}

const EN_TO_AR_WORD = {
  mohammad: 'محمد',
  muhammad: 'محمد',
  ahmad: 'أحمد',
  ahmed: 'أحمد',
  mahmoud: 'محمود',
  abdullah: 'عبدالله',
  abdallah: 'عبدالله',
  abdulrahman: 'عبدالرحمن',
  omar: 'عمر',
  ali: 'علي',
  khaled: 'خالد',
  khalil: 'خليل',
  yazan: 'يزن',
  yazeed: 'يزيد',
  moaz: 'معاذ',
  tareq: 'طارق',
  tariq: 'طارق',
  zaid: 'زيد',
  zaidan: 'زيدان',
  samer: 'سامر',
  saif: 'سيف',
  hossam: 'حسام',
  bassem: 'باسم',
  amjad: 'أمجد',
  eyad: 'إياد',
  hamza: 'حمزة',
  haitham: 'هيثم',
  wael: 'وائل',
  raed: 'رائد',
  fahad: 'فهد',
  fares: 'فارس',
  nasser: 'ناصر',
  jameel: 'جميل',
}

const AR_TO_EN_CHAR = {
  ا: 'a',
  أ: 'a',
  إ: 'i',
  آ: 'aa',
  ء: '',
  ب: 'b',
  ت: 't',
  ث: 'th',
  ج: 'j',
  ح: 'h',
  خ: 'kh',
  د: 'd',
  ذ: 'dh',
  ر: 'r',
  ز: 'z',
  س: 's',
  ش: 'sh',
  ص: 's',
  ض: 'd',
  ط: 't',
  ظ: 'z',
  ع: 'a',
  غ: 'gh',
  ف: 'f',
  ق: 'q',
  ك: 'k',
  ل: 'l',
  م: 'm',
  ن: 'n',
  ه: 'h',
  و: 'w',
  ي: 'y',
  ى: 'a',
  ة: 'a',
  ئ: 'e',
  ؤ: 'o',
}

const EN_DIGRAPHS = [
  ['sh', 'ش'],
  ['kh', 'خ'],
  ['gh', 'غ'],
  ['th', 'ث'],
  ['dh', 'ذ'],
  ['ch', 'تش'],
  ['ph', 'ف'],
  ['aa', 'ا'],
  ['ee', 'ي'],
  ['oo', 'و'],
  ['ou', 'و'],
]

const EN_TO_AR_CHAR = {
  a: 'ا',
  b: 'ب',
  c: 'ك',
  d: 'د',
  e: 'ي',
  f: 'ف',
  g: 'ج',
  h: 'ه',
  i: 'ي',
  j: 'ج',
  k: 'ك',
  l: 'ل',
  m: 'م',
  n: 'ن',
  o: 'و',
  p: 'ب',
  q: 'ق',
  r: 'ر',
  s: 'س',
  t: 'ت',
  u: 'و',
  v: 'ف',
  w: 'و',
  x: 'كس',
  y: 'ي',
  z: 'ز',
}

function normalizeArabicWord(word) {
  return String(word || '')
    .replace(ARABIC_DIACRITICS, '')
    .replace(/[\u0622\u0623\u0625]/g, 'ا')
    .replace(/ة/g, 'ه')
    .trim()
}

function titleCase(word) {
  if (!word) return ''
  return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()
}

function transliterateArabicWord(word) {
  const normalized = normalizeArabicWord(word)
  if (!normalized) return ''
  if (AR_TO_EN_WORD[normalized]) return AR_TO_EN_WORD[normalized]

  let out = ''
  for (const ch of normalized) {
    out += AR_TO_EN_CHAR[ch] ?? ch
  }
  return titleCase(out.replace(/aa+/g, 'a'))
}

function transliterateEnglishWord(word) {
  const normalized = String(word || '').trim().toLowerCase()
  if (!normalized) return ''
  if (EN_TO_AR_WORD[normalized]) return EN_TO_AR_WORD[normalized]

  let left = normalized
  let out = ''
  while (left.length > 0) {
    let matched = false
    for (const [latin, arabic] of EN_DIGRAPHS) {
      if (left.startsWith(latin)) {
        out += arabic
        left = left.slice(latin.length)
        matched = true
        break
      }
    }
    if (matched) continue
    out += EN_TO_AR_CHAR[left[0]] ?? left[0]
    left = left.slice(1)
  }
  return out
}

export function convertNameAuto(direction, value) {
  const words = String(value || '')
    .split(/\s+/)
    .filter(Boolean)
  if (words.length === 0) return ''

  if (direction === 'ar_to_en') {
    return words.map(transliterateArabicWord).filter(Boolean).join(' ')
  }
  if (direction === 'en_to_ar') {
    return words.map(transliterateEnglishWord).filter(Boolean).join(' ')
  }
  return String(value || '')
}

