// @design-system: primitives/CountryCodeSelect

export interface CountryCode {
  code: string;
  dialCode: string;
  flag: string;
  nameHe: string;
  nameEn: string;
}

/** Derive flag emoji from ISO 3166-1 alpha-2 code */
function flag(iso: string): string {
  return String.fromCodePoint(...[...iso.toUpperCase()].map((c) => 0x1f1e6 + c.charCodeAt(0) - 65));
}

/** Raw data: [ISO, dialCode, nameEn, nameHe] */
const RAW: [string, string, string, string][] = [
  // ── Sorted alphabetically by English name (Israel injected first below) ──
  ['AF', '+93', 'Afghanistan', 'אפגניסטן'],
  ['AL', '+355', 'Albania', 'אלבניה'],
  ['DZ', '+213', 'Algeria', "אלג'יריה"],
  ['AD', '+376', 'Andorra', 'אנדורה'],
  ['AO', '+244', 'Angola', 'אנגולה'],
  ['AG', '+1268', 'Antigua and Barbuda', 'אנטיגואה וברבודה'],
  ['AR', '+54', 'Argentina', 'ארגנטינה'],
  ['AM', '+374', 'Armenia', 'ארמניה'],
  ['AU', '+61', 'Australia', 'אוסטרליה'],
  ['AT', '+43', 'Austria', 'אוסטריה'],
  ['AZ', '+994', 'Azerbaijan', "אזרבייג'ן"],
  ['BS', '+1242', 'Bahamas', 'איי בהאמה'],
  ['BH', '+973', 'Bahrain', 'בחריין'],
  ['BD', '+880', 'Bangladesh', 'בנגלדש'],
  ['BB', '+1246', 'Barbados', 'ברבדוס'],
  ['BY', '+375', 'Belarus', 'בלארוס'],
  ['BE', '+32', 'Belgium', 'בלגיה'],
  ['BZ', '+501', 'Belize', 'בליז'],
  ['BJ', '+229', 'Benin', 'בנין'],
  ['BT', '+975', 'Bhutan', 'בהוטן'],
  ['BO', '+591', 'Bolivia', 'בוליביה'],
  ['BA', '+387', 'Bosnia and Herzegovina', 'בוסניה והרצגובינה'],
  ['BW', '+267', 'Botswana', 'בוצואנה'],
  ['BR', '+55', 'Brazil', 'ברזיל'],
  ['BN', '+673', 'Brunei', 'ברוניי'],
  ['BG', '+359', 'Bulgaria', 'בולגריה'],
  ['BF', '+226', 'Burkina Faso', 'בורקינה פאסו'],
  ['BI', '+257', 'Burundi', 'בורונדי'],
  ['CV', '+238', 'Cabo Verde', 'קאבו ורדה'],
  ['KH', '+855', 'Cambodia', 'קמבודיה'],
  ['CM', '+237', 'Cameroon', 'קמרון'],
  ['CA', '+1', 'Canada', 'קנדה'],
  ['CF', '+236', 'Central African Republic', 'הרפובליקה המרכז-אפריקאית'],
  ['TD', '+235', 'Chad', "צ'אד"],
  ['CL', '+56', 'Chile', "צ'ילה"],
  ['CN', '+86', 'China', 'סין'],
  ['CO', '+57', 'Colombia', 'קולומביה'],
  ['KM', '+269', 'Comoros', 'קומורו'],
  ['CG', '+242', 'Congo', 'קונגו'],
  ['CD', '+243', 'Congo (DR)', 'קונגו (הרפובליקה הדמוקרטית)'],
  ['CR', '+506', 'Costa Rica', 'קוסטה ריקה'],
  ['HR', '+385', 'Croatia', 'קרואטיה'],
  ['CU', '+53', 'Cuba', 'קובה'],
  ['CY', '+357', 'Cyprus', 'קפריסין'],
  ['CZ', '+420', 'Czech Republic', "צ'כיה"],
  ['DK', '+45', 'Denmark', 'דנמרק'],
  ['DJ', '+253', 'Djibouti', "ג'יבוטי"],
  ['DM', '+1767', 'Dominica', 'דומיניקה'],
  ['DO', '+1809', 'Dominican Republic', 'הרפובליקה הדומיניקנית'],
  ['EC', '+593', 'Ecuador', 'אקוודור'],
  ['EG', '+20', 'Egypt', 'מצרים'],
  ['SV', '+503', 'El Salvador', 'אל סלבדור'],
  ['GQ', '+240', 'Equatorial Guinea', 'גינאה המשוונית'],
  ['ER', '+291', 'Eritrea', 'אריתריאה'],
  ['EE', '+372', 'Estonia', 'אסטוניה'],
  ['SZ', '+268', 'Eswatini', 'אסוואטיני'],
  ['ET', '+251', 'Ethiopia', 'אתיופיה'],
  ['FJ', '+679', 'Fiji', "פיג'י"],
  ['FI', '+358', 'Finland', 'פינלנד'],
  ['FR', '+33', 'France', 'צרפת'],
  ['GA', '+241', 'Gabon', 'גבון'],
  ['GM', '+220', 'Gambia', 'גמביה'],
  ['GE', '+995', 'Georgia', 'גאורגיה'],
  ['DE', '+49', 'Germany', 'גרמניה'],
  ['GH', '+233', 'Ghana', 'גאנה'],
  ['GR', '+30', 'Greece', 'יוון'],
  ['GD', '+1473', 'Grenada', 'גרנדה'],
  ['GT', '+502', 'Guatemala', 'גואטמלה'],
  ['GN', '+224', 'Guinea', 'גינאה'],
  ['GW', '+245', 'Guinea-Bissau', 'גינאה-ביסאו'],
  ['GY', '+592', 'Guyana', 'גיאנה'],
  ['HT', '+509', 'Haiti', 'האיטי'],
  ['HN', '+504', 'Honduras', 'הונדורס'],
  ['HU', '+36', 'Hungary', 'הונגריה'],
  ['IS', '+354', 'Iceland', 'איסלנד'],
  ['IN', '+91', 'India', 'הודו'],
  ['ID', '+62', 'Indonesia', 'אינדונזיה'],
  ['IR', '+98', 'Iran', 'איראן'],
  ['IQ', '+964', 'Iraq', 'עיראק'],
  ['IE', '+353', 'Ireland', 'אירלנד'],
  ['IT', '+39', 'Italy', 'איטליה'],
  ['JM', '+1876', 'Jamaica', "ג'מייקה"],
  ['JP', '+81', 'Japan', 'יפן'],
  ['JO', '+962', 'Jordan', 'ירדן'],
  ['KZ', '+7', 'Kazakhstan', 'קזחסטן'],
  ['KE', '+254', 'Kenya', 'קניה'],
  ['KI', '+686', 'Kiribati', 'קיריבאטי'],
  ['KP', '+850', 'Korea (North)', 'קוריאה הצפונית'],
  ['KR', '+82', 'Korea (South)', 'קוריאה הדרומית'],
  ['KW', '+965', 'Kuwait', 'כווית'],
  ['KG', '+996', 'Kyrgyzstan', 'קירגיסטן'],
  ['LA', '+856', 'Laos', 'לאוס'],
  ['LV', '+371', 'Latvia', 'לטביה'],
  ['LB', '+961', 'Lebanon', 'לבנון'],
  ['LS', '+266', 'Lesotho', 'לסוטו'],
  ['LR', '+231', 'Liberia', 'ליבריה'],
  ['LY', '+218', 'Libya', 'לוב'],
  ['LI', '+423', 'Liechtenstein', 'ליכטנשטיין'],
  ['LT', '+370', 'Lithuania', 'ליטא'],
  ['LU', '+352', 'Luxembourg', 'לוקסמבורג'],
  ['MG', '+261', 'Madagascar', 'מדגסקר'],
  ['MW', '+265', 'Malawi', 'מלאווי'],
  ['MY', '+60', 'Malaysia', 'מלזיה'],
  ['MV', '+960', 'Maldives', 'מלדיביים'],
  ['ML', '+223', 'Mali', 'מאלי'],
  ['MT', '+356', 'Malta', 'מלטה'],
  ['MH', '+692', 'Marshall Islands', 'איי מרשל'],
  ['MR', '+222', 'Mauritania', 'מאוריטניה'],
  ['MU', '+230', 'Mauritius', 'מאוריציוס'],
  ['MX', '+52', 'Mexico', 'מקסיקו'],
  ['FM', '+691', 'Micronesia', 'מיקרונזיה'],
  ['MD', '+373', 'Moldova', 'מולדובה'],
  ['MC', '+377', 'Monaco', 'מונקו'],
  ['MN', '+976', 'Mongolia', 'מונגוליה'],
  ['ME', '+382', 'Montenegro', 'מונטנגרו'],
  ['MA', '+212', 'Morocco', 'מרוקו'],
  ['MZ', '+258', 'Mozambique', 'מוזמביק'],
  ['MM', '+95', 'Myanmar', 'מיאנמר'],
  ['NA', '+264', 'Namibia', 'נמיביה'],
  ['NR', '+674', 'Nauru', 'נאורו'],
  ['NP', '+977', 'Nepal', 'נפאל'],
  ['NL', '+31', 'Netherlands', 'הולנד'],
  ['NZ', '+64', 'New Zealand', 'ניו זילנד'],
  ['NI', '+505', 'Nicaragua', 'ניקרגואה'],
  ['NE', '+227', 'Niger', "ניז'ר"],
  ['NG', '+234', 'Nigeria', 'ניגריה'],
  ['MK', '+389', 'North Macedonia', 'מקדוניה הצפונית'],
  ['NO', '+47', 'Norway', 'נורווגיה'],
  ['OM', '+968', 'Oman', 'עומאן'],
  ['PK', '+92', 'Pakistan', 'פקיסטן'],
  ['PW', '+680', 'Palau', 'פלאו'],
  ['PA', '+507', 'Panama', 'פנמה'],
  ['PG', '+675', 'Papua New Guinea', 'פפואה גינאה החדשה'],
  ['PY', '+595', 'Paraguay', 'פרגוואי'],
  ['PE', '+51', 'Peru', 'פרו'],
  ['PH', '+63', 'Philippines', 'פיליפינים'],
  ['PL', '+48', 'Poland', 'פולין'],
  ['PT', '+351', 'Portugal', 'פורטוגל'],
  ['QA', '+974', 'Qatar', 'קטר'],
  ['RO', '+40', 'Romania', 'רומניה'],
  ['RU', '+7', 'Russia', 'רוסיה'],
  ['RW', '+250', 'Rwanda', 'רואנדה'],
  ['KN', '+1869', 'Saint Kitts and Nevis', 'סנט קיטס ונוויס'],
  ['LC', '+1758', 'Saint Lucia', 'סנט לוסיה'],
  ['VC', '+1784', 'Saint Vincent and the Grenadines', 'סנט וינסנט והגרנדינים'],
  ['WS', '+685', 'Samoa', 'סמואה'],
  ['SM', '+378', 'San Marino', 'סן מרינו'],
  ['ST', '+239', 'Sao Tome and Principe', 'סאו טומה ופרינסיפה'],
  ['SA', '+966', 'Saudi Arabia', 'ערב הסעודית'],
  ['SN', '+221', 'Senegal', 'סנגל'],
  ['RS', '+381', 'Serbia', 'סרביה'],
  ['SC', '+248', 'Seychelles', 'איי סיישל'],
  ['SL', '+232', 'Sierra Leone', 'סיירה לאונה'],
  ['SG', '+65', 'Singapore', 'סינגפור'],
  ['SK', '+421', 'Slovakia', 'סלובקיה'],
  ['SI', '+386', 'Slovenia', 'סלובניה'],
  ['SB', '+677', 'Solomon Islands', 'איי שלמה'],
  ['SO', '+252', 'Somalia', 'סומליה'],
  ['ZA', '+27', 'South Africa', 'דרום אפריקה'],
  ['SS', '+211', 'South Sudan', 'דרום סודן'],
  ['ES', '+34', 'Spain', 'ספרד'],
  ['LK', '+94', 'Sri Lanka', 'סרי לנקה'],
  ['SD', '+249', 'Sudan', 'סודן'],
  ['SR', '+597', 'Suriname', 'סורינאם'],
  ['SE', '+46', 'Sweden', 'שוודיה'],
  ['CH', '+41', 'Switzerland', 'שווייץ'],
  ['SY', '+963', 'Syria', 'סוריה'],
  ['TW', '+886', 'Taiwan', 'טייוואן'],
  ['TJ', '+992', 'Tajikistan', "טג'יקיסטן"],
  ['TZ', '+255', 'Tanzania', 'טנזניה'],
  ['TH', '+66', 'Thailand', 'תאילנד'],
  ['TL', '+670', 'Timor-Leste', 'טימור-לסטה'],
  ['TG', '+228', 'Togo', 'טוגו'],
  ['TO', '+676', 'Tonga', 'טונגה'],
  ['TT', '+1868', 'Trinidad and Tobago', 'טרינידד וטובגו'],
  ['TN', '+216', 'Tunisia', 'תוניסיה'],
  ['TR', '+90', 'Turkey', 'טורקיה'],
  ['TM', '+993', 'Turkmenistan', 'טורקמניסטן'],
  ['TV', '+688', 'Tuvalu', 'טובאלו'],
  ['UG', '+256', 'Uganda', 'אוגנדה'],
  ['UA', '+380', 'Ukraine', 'אוקראינה'],
  ['AE', '+971', 'United Arab Emirates', 'איחוד האמירויות'],
  ['GB', '+44', 'United Kingdom', 'הממלכה המאוחדת'],
  ['US', '+1', 'United States', 'ארצות הברית'],
  ['UY', '+598', 'Uruguay', 'אורוגוואי'],
  ['UZ', '+998', 'Uzbekistan', 'אוזבקיסטן'],
  ['VU', '+678', 'Vanuatu', 'ונואטו'],
  ['VE', '+58', 'Venezuela', 'ונצואלה'],
  ['VN', '+84', 'Vietnam', 'וייטנאם'],
  ['YE', '+967', 'Yemen', 'תימן'],
  ['ZM', '+260', 'Zambia', 'זמביה'],
  ['ZW', '+263', 'Zimbabwe', 'זימבבווה'],
];

const ISRAEL: CountryCode = {
  code: 'IL',
  dialCode: '+972',
  flag: flag('IL'),
  nameHe: 'ישראל',
  nameEn: 'Israel',
};

const REST: CountryCode[] = RAW.map(([code, dialCode, nameEn, nameHe]) => ({
  code,
  dialCode,
  flag: flag(code),
  nameHe,
  nameEn,
}));

/** Full country list — Israel first, rest alphabetical by English name. */
export const COUNTRY_CODES: CountryCode[] = [ISRAEL, ...REST];

/** Look up dial code from ISO 3166-1 alpha-2 code. Falls back to +972. */
export function getDialCode(isoCode: string): string {
  return (COUNTRY_CODES.find((c) => c.code === isoCode) ?? ISRAEL).dialCode;
}
