// Country flag sprite mapping for /assets/icons/flags-1.png.
//
// The sprite packs 16x11px flags in a 16-column, row-major grid; a flag's sprite
// position is its index in COUNTRY_FLAG_CODES, so this order must match the PNG
// exactly. This order is taken verbatim from the original 4chan flags.css sprite
// (flags.8.png), which is the source of this PNG.

export const COUNTRY_FLAG_WIDTH = 16;
export const COUNTRY_FLAG_HEIGHT = 11;
const COUNTRY_FLAG_COLUMNS = 16;

const COUNTRY_FLAG_CODES = [
  'ad',
  'ae',
  'af',
  'ag',
  'ai',
  'al',
  'am',
  'an',
  'ao',
  'aq',
  'ar',
  'as',
  'at',
  'au',
  'aw',
  'ax',
  'az',
  'ba',
  'bb',
  'bd',
  'be',
  'bf',
  'bg',
  'bh',
  'bi',
  'bj',
  'bl',
  'bm',
  'bn',
  'bo',
  'bq',
  'br',
  'bs',
  'bt',
  'bv',
  'bw',
  'by',
  'bz',
  'ca',
  'catalonia',
  'cc',
  'cd',
  'cf',
  'cg',
  'ch',
  'ci',
  'ck',
  'cl',
  'cm',
  'cn',
  'co',
  'cr',
  'cs',
  'cu',
  'cv',
  'cw',
  'cx',
  'cy',
  'cz',
  'de',
  'dj',
  'dk',
  'dm',
  'do',
  'dz',
  'ec',
  'ee',
  'eg',
  'eh',
  'xe',
  'er',
  'es',
  'et',
  'eu',
  'fam',
  'fi',
  'fj',
  'fk',
  'fm',
  'fo',
  'fr',
  'ga',
  'gb',
  'gd',
  'ge',
  'gf',
  'gg',
  'gh',
  'gi',
  'gl',
  'gm',
  'gn',
  'gp',
  'gq',
  'gr',
  'gs',
  'gt',
  'gu',
  'gw',
  'gy',
  'hk',
  'hm',
  'hn',
  'hr',
  'ht',
  'hu',
  'id',
  'ie',
  'il',
  'im',
  'in',
  'io',
  'iq',
  'ir',
  'is',
  'it',
  'je',
  'jm',
  'jo',
  'jp',
  'ke',
  'kg',
  'kh',
  'ki',
  'km',
  'kn',
  'kp',
  'kr',
  'kw',
  'ky',
  'kz',
  'la',
  'lb',
  'lc',
  'li',
  'lk',
  'lr',
  'ls',
  'lt',
  'lu',
  'lv',
  'ly',
  'ma',
  'mc',
  'md',
  'me',
  'mf',
  'mg',
  'mh',
  'mk',
  'ml',
  'mm',
  'mn',
  'mo',
  'mp',
  'mq',
  'mr',
  'ms',
  'mt',
  'mu',
  'mv',
  'mw',
  'mx',
  'my',
  'mz',
  'na',
  'nc',
  'ne',
  'nf',
  'ng',
  'ni',
  'nl',
  'no',
  'np',
  'nr',
  'nu',
  'nz',
  'om',
  'pa',
  'pe',
  'pf',
  'pg',
  'ph',
  'pk',
  'pl',
  'pm',
  'pn',
  'pr',
  'ps',
  'pt',
  'pw',
  'py',
  'qa',
  're',
  'ro',
  'rs',
  'ru',
  'rw',
  'sa',
  'sb',
  'sc',
  'xs',
  'sd',
  'se',
  'sg',
  'sh',
  'si',
  'sj',
  'sk',
  'sl',
  'sm',
  'sn',
  'so',
  'sr',
  'ss',
  'st',
  'sv',
  'sx',
  'sy',
  'sz',
  'tc',
  'td',
  'tf',
  'tg',
  'th',
  'tj',
  'tk',
  'tl',
  'tm',
  'tn',
  'to',
  'tr',
  'tt',
  'tv',
  'tw',
  'tz',
  'ua',
  'ug',
  'um',
  'us',
  'uy',
  'uz',
  'va',
  'vc',
  've',
  'vg',
  'vi',
  'vn',
  'vu',
  'xw',
  'wf',
  'ws',
  'xk',
  'xx',
  'ye',
  'yt',
  'za',
  'zm',
  'zw',
] as const;

const COUNTRY_FLAG_INDEX_BY_CODE: ReadonlyMap<string, number> = new Map(COUNTRY_FLAG_CODES.map((code, index) => [code, index]));

const countryDisplayNames = typeof Intl.DisplayNames === 'function' ? new Intl.DisplayNames(undefined, { type: 'region' }) : undefined;

export const normalizeCountryCode = (value: string | undefined) => {
  const code = value?.trim().toLowerCase();
  if (!code) return undefined;
  if (code === 'uk') return 'gb';
  return COUNTRY_FLAG_INDEX_BY_CODE.has(code) ? code : undefined;
};

export const getCountryFlagPosition = (value: string | undefined): { x: number; y: number } | undefined => {
  const code = normalizeCountryCode(value);
  const index = code === undefined ? undefined : COUNTRY_FLAG_INDEX_BY_CODE.get(code);
  if (index === undefined) return undefined;
  return {
    x: (index % COUNTRY_FLAG_COLUMNS) * COUNTRY_FLAG_WIDTH,
    y: Math.floor(index / COUNTRY_FLAG_COLUMNS) * COUNTRY_FLAG_HEIGHT,
  };
};

export const getCountryLabel = (value: string | undefined) => {
  const code = normalizeCountryCode(value);
  if (!code) return undefined;
  const regionName = code.length === 2 ? countryDisplayNames?.of(code.toUpperCase()) : undefined;
  return regionName ?? code.toUpperCase();
};
