import type { PoolClient } from 'pg';

const wordMap: Record<string, string> = {
  احمد: 'ahmed', محمد: 'mohammed', محمود: 'mahmoud', ابراهيم: 'ibrahim', يوسف: 'yousef',
  عمر: 'omar', علي: 'ali', حسن: 'hassan', حسين: 'hussein', خالد: 'khaled', عبدالله: 'abdullah',
  عبدالرحمن: 'abdulrahman', فاطمه: 'fatima', مريم: 'maryam', نور: 'noor', ساره: 'sara',
  بن: 'bin', بنت: 'bint', منصور: 'mansour',
};

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

const normalizeArabic = (value: string): string => value
  .normalize('NFKD').replace(/[\u064B-\u065F\u0670]/g, '')
  .replace(/[أإآ]/g, 'ا').replace(/ؤ/g, 'و').replace(/ئ/g, 'ي');

const transliterateWord = (word: string): string => {
  const normalized = normalizeArabic(word);
  if (wordMap[normalized]) return wordMap[normalized];
  return [...normalized].map((character) => letterMap[character] ?? character).join('');
};

export const usernameBaseFromName = (displayName: string): string => {
  const parts = displayName.trim().split(/\s+/).filter(Boolean).map(transliterateWord);
  let base = parts.join('').toLowerCase().replace(/[^a-z0-9]/g, '');
  if (!/^[a-z]/.test(base)) base = `member${base}`;
  if (base.length < 4) base = `${base}member`;
  return base.slice(0, 28);
};

export const generateAvailableUsername = async (
  client: PoolClient,
  displayName: string,
): Promise<string> => {
  const base = usernameBaseFromName(displayName);
  for (let suffix = 0; suffix < 10_000; suffix += 1) {
    const ending = suffix === 0 ? '' : String(suffix).padStart(2, '0');
    const candidate = `${base.slice(0, 30 - ending.length)}${ending}`;
    const exists = await client.query('SELECT 1 FROM users WHERE LOWER(username)=LOWER($1)', [candidate]);
    if (!exists.rowCount) return candidate;
  }
  throw new Error('Unable to generate an available username');
};
