/** Phone country list for mobile prefix picker (flags + dial codes) — aligned with CRM. */

export type PhoneCountryOption = {
  iso2: string;
  dial: string;
  nameFr: string;
  nameEn: string;
  nameAr: string;
  flag: string;
};

function flagEmoji(iso2: string): string {
  const code = iso2.toUpperCase();
  if (code.length !== 2) return '🌐';
  return String.fromCodePoint(...[...code].map((c) => 0x1f1e6 + c.charCodeAt(0) - 65));
}

/** [iso2, nameFr, dialDigits, nameEn?, nameAr?] — Maghreb / Europe / Golfe first. */
const RAW: Array<[string, string, string, string?, string?]> = [
  ['TN', 'Tunisie', '216', 'Tunisia', 'تونس'],
  ['MA', 'Maroc', '212', 'Morocco', 'المغرب'],
  ['DZ', 'Algérie', '213', 'Algeria', 'الجزائر'],
  ['FR', 'France', '33', 'France', 'فرنسا'],
  ['BE', 'Belgique', '32', 'Belgium', 'بلجيكا'],
  ['CH', 'Suisse', '41', 'Switzerland', 'سويسرا'],
  ['LU', 'Luxembourg', '352', 'Luxembourg', 'لوكسمبورغ'],
  ['MC', 'Monaco', '377', 'Monaco', 'موناكو'],
  ['ES', 'Espagne', '34', 'Spain', 'إسبانيا'],
  ['IT', 'Italie', '39', 'Italy', 'إيطاليا'],
  ['DE', 'Allemagne', '49', 'Germany', 'ألمانيا'],
  ['NL', 'Pays-Bas', '31', 'Netherlands', 'هولندا'],
  ['PT', 'Portugal', '351', 'Portugal', 'البرتغال'],
  ['GB', 'Royaume-Uni', '44', 'United Kingdom', 'المملكة المتحدة'],
  ['IE', 'Irlande', '353', 'Ireland', 'أيرلندا'],
  ['US', 'États-Unis / Canada', '1', 'USA / Canada', 'الولايات المتحدة / كندا'],
  ['SA', 'Arabie saoudite', '966', 'Saudi Arabia', 'السعودية'],
  ['AE', 'Émirats arabes unis', '971', 'UAE', 'الإمارات'],
  ['QA', 'Qatar', '974', 'Qatar', 'قطر'],
  ['BH', 'Bahreïn', '973', 'Bahrain', 'البحرين'],
  ['OM', 'Oman', '968', 'Oman', 'عمان'],
  ['KW', 'Koweït', '965', 'Kuwait', 'الكويت'],
  ['LB', 'Liban', '961', 'Lebanon', 'لبنان'],
  ['JO', 'Jordanie', '962', 'Jordan', 'الأردن'],
  ['EG', 'Égypte', '20', 'Egypt', 'مصر'],
  ['LY', 'Libye', '218', 'Libya', 'ليبيا'],
  ['MR', 'Mauritanie', '222', 'Mauritania', 'موريتانيا'],
  ['SN', 'Sénégal', '221', 'Senegal', 'السنغال'],
  ['CI', "Côte d'Ivoire", '225', 'Ivory Coast', 'ساحل العاج'],
  ['CM', 'Cameroun', '237', 'Cameroon', 'الكاميرون'],
  ['CD', 'RD Congo', '243', 'Congo DR', 'جمهورية الكونغو الديمقراطية'],
  ['CG', 'Congo', '242', 'Congo', 'الكونغو'],
  ['KE', 'Kenya', '254', 'Kenya', 'كينيا'],
  ['TZ', 'Tanzanie', '255', 'Tanzania', 'تنزانيا'],
  ['UG', 'Ouganda', '256', 'Uganda', 'أوغندا'],
  ['ZA', 'Afrique du Sud', '27', 'South Africa', 'جنوب أفريقيا'],
  ['NG', 'Nigeria', '234', 'Nigeria', 'نيجيريا'],
  ['GH', 'Ghana', '233', 'Ghana', 'غانا'],
  ['TR', 'Turquie', '90', 'Turkey', 'تركيا'],
  ['GR', 'Grèce', '30', 'Greece', 'اليونان'],
  ['PL', 'Pologne', '48', 'Poland', 'بولندا'],
  ['RO', 'Roumanie', '40', 'Romania', 'رومانيا'],
  ['RU', 'Russie', '7', 'Russia', 'روسيا'],
  ['UA', 'Ukraine', '380', 'Ukraine', 'أوكرانيا'],
  ['SE', 'Suède', '46', 'Sweden', 'السويد'],
  ['NO', 'Norvège', '47', 'Norway', 'النرويج'],
  ['DK', 'Danemark', '45', 'Denmark', 'الدنمارك'],
  ['FI', 'Finlande', '358', 'Finland', 'فنلندا'],
  ['AT', 'Autriche', '43', 'Austria', 'النمسا'],
  ['CZ', 'Tchéquie', '420', 'Czechia', 'التشيك'],
  ['HU', 'Hongrie', '36', 'Hungary', 'المجر'],
  ['IN', 'Inde', '91', 'India', 'الهند'],
  ['PK', 'Pakistan', '92', 'Pakistan', 'باكستان'],
  ['BD', 'Bangladesh', '880', 'Bangladesh', 'بنغلاديش'],
  ['CN', 'Chine', '86', 'China', 'الصين'],
  ['JP', 'Japon', '81', 'Japan', 'اليابان'],
  ['KR', 'Corée du Sud', '82', 'South Korea', 'كوريا الجنوبية'],
  ['TH', 'Thaïlande', '66', 'Thailand', 'تايلاند'],
  ['VN', 'Vietnam', '84', 'Vietnam', 'فيتنام'],
  ['MY', 'Malaisie', '60', 'Malaysia', 'ماليزيا'],
  ['SG', 'Singapour', '65', 'Singapore', 'سنغافورة'],
  ['ID', 'Indonésie', '62', 'Indonesia', 'إندونيسيا'],
  ['PH', 'Philippines', '63', 'Philippines', 'الفلبين'],
  ['AU', 'Australie', '61', 'Australia', 'أستراليا'],
  ['NZ', 'Nouvelle-Zélande', '64', 'New Zealand', 'نيوزيلندا'],
  ['BR', 'Brésil', '55', 'Brazil', 'البرازيل'],
  ['AR', 'Argentine', '54', 'Argentina', 'الأرجنتين'],
  ['MX', 'Mexique', '52', 'Mexico', 'المكسيك'],
];

function buildCountries(): PhoneCountryOption[] {
  const seen = new Set<string>();
  const out: PhoneCountryOption[] = [];
  for (const [iso2, nameFr, dial, nameEn, nameAr] of RAW) {
    if (seen.has(dial)) continue;
    seen.add(dial);
    out.push({
      iso2,
      dial,
      nameFr,
      nameEn: nameEn ?? nameFr,
      nameAr: nameAr ?? nameFr,
      flag: flagEmoji(iso2),
    });
  }
  return out;
}

export const PHONE_COUNTRIES: PhoneCountryOption[] = buildCountries();

const DIAL_SORTED = [...new Set(PHONE_COUNTRIES.map((c) => c.dial))].sort(
  (a, b) => b.length - a.length,
);

export function getPhoneCountryByDial(dial: string): PhoneCountryOption | undefined {
  const digits = String(dial ?? '').replace(/\D/g, '');
  if (!digits) return undefined;
  return PHONE_COUNTRIES.find((c) => c.dial === digits);
}

export function detectPhoneCountryFromRaw(raw: string | null | undefined): PhoneCountryOption | undefined {
  let digits = String(raw ?? '')
    .trim()
    .replace(/[\s().-]/g, '');
  if (digits.startsWith('00')) digits = digits.slice(2);
  digits = digits.replace(/^\+/, '').replace(/\D/g, '');
  if (!digits) return undefined;
  for (const code of DIAL_SORTED) {
    if (digits.startsWith(code) && digits.length > code.length) {
      return getPhoneCountryByDial(code);
    }
  }
  return undefined;
}

export function flagForPhone(raw: string | null | undefined, prefix?: string | null): string {
  const fromPrefix = prefix ? getPhoneCountryByDial(prefix) : undefined;
  const fromRaw = detectPhoneCountryFromRaw(raw);
  return (fromPrefix ?? fromRaw)?.flag ?? '🌐';
}

export function phoneCountryDisplayName(c: PhoneCountryOption, lang?: string): string {
  if (lang?.startsWith('en')) return c.nameEn;
  if (lang?.startsWith('ar')) return c.nameAr;
  return c.nameFr;
}
