// tc-geo.jsx — US states (2-letter) + every country (3-letter ISO alpha-3).
// The form's "State" box stays labeled "State"; we just let it hold a country
// code when working abroad. Typing a country NAME (or its 2-letter code) auto-
// corrects to the 3-letter code. US input stays 2-letter. Loaded after tc-logic.

// [common name, ISO alpha-2, ISO alpha-3]
const COUNTRY_TABLE = [
  ['Afghanistan','AF','AFG'],['Albania','AL','ALB'],['Algeria','DZ','DZA'],['Andorra','AD','AND'],
  ['Angola','AO','AGO'],['Antigua and Barbuda','AG','ATG'],['Argentina','AR','ARG'],['Armenia','AM','ARM'],
  ['Australia','AU','AUS'],['Austria','AT','AUT'],['Azerbaijan','AZ','AZE'],['Bahamas','BS','BHS'],
  ['Bahrain','BH','BHR'],['Bangladesh','BD','BGD'],['Barbados','BB','BRB'],['Belarus','BY','BLR'],
  ['Belgium','BE','BEL'],['Belize','BZ','BLZ'],['Benin','BJ','BEN'],['Bhutan','BT','BTN'],
  ['Bolivia','BO','BOL'],['Bosnia and Herzegovina','BA','BIH'],['Botswana','BW','BWA'],['Brazil','BR','BRA'],
  ['Brunei','BN','BRN'],['Bulgaria','BG','BGR'],['Burkina Faso','BF','BFA'],['Burundi','BI','BDI'],
  ['Cambodia','KH','KHM'],['Cameroon','CM','CMR'],['Canada','CA','CAN'],['Cape Verde','CV','CPV'],
  ['Central African Republic','CF','CAF'],['Chad','TD','TCD'],['Chile','CL','CHL'],['China','CN','CHN'],
  ['Colombia','CO','COL'],['Comoros','KM','COM'],['Congo','CG','COG'],['Congo (DRC)','CD','COD'],
  ['Costa Rica','CR','CRI'],['Croatia','HR','HRV'],['Cuba','CU','CUB'],['Cyprus','CY','CYP'],
  ['Czechia','CZ','CZE'],['Denmark','DK','DNK'],['Djibouti','DJ','DJI'],['Dominica','DM','DMA'],
  ['Dominican Republic','DO','DOM'],['Ecuador','EC','ECU'],['Egypt','EG','EGY'],['El Salvador','SV','SLV'],
  ['Equatorial Guinea','GQ','GNQ'],['Eritrea','ER','ERI'],['Estonia','EE','EST'],['Eswatini','SZ','SWZ'],
  ['Ethiopia','ET','ETH'],['Fiji','FJ','FJI'],['Finland','FI','FIN'],['France','FR','FRA'],
  ['Gabon','GA','GAB'],['Gambia','GM','GMB'],['Georgia (country)','GE','GEO'],['Germany','DE','DEU'],
  ['Ghana','GH','GHA'],['Greece','GR','GRC'],['Grenada','GD','GRD'],['Guatemala','GT','GTM'],
  ['Guinea','GN','GIN'],['Guinea-Bissau','GW','GNB'],['Guyana','GY','GUY'],['Haiti','HT','HTI'],
  ['Honduras','HN','HND'],['Hungary','HU','HUN'],['Iceland','IS','ISL'],['India','IN','IND'],
  ['Indonesia','ID','IDN'],['Iran','IR','IRN'],['Iraq','IQ','IRQ'],['Ireland','IE','IRL'],
  ['Israel','IL','ISR'],['Italy','IT','ITA'],['Ivory Coast','CI','CIV'],['Jamaica','JM','JAM'],
  ['Japan','JP','JPN'],['Jordan','JO','JOR'],['Kazakhstan','KZ','KAZ'],['Kenya','KE','KEN'],
  ['Kiribati','KI','KIR'],['Kosovo','XK','XKX'],['Kuwait','KW','KWT'],['Kyrgyzstan','KG','KGZ'],
  ['Laos','LA','LAO'],['Latvia','LV','LVA'],['Lebanon','LB','LBN'],['Lesotho','LS','LSO'],
  ['Liberia','LR','LBR'],['Libya','LY','LBY'],['Liechtenstein','LI','LIE'],['Lithuania','LT','LTU'],
  ['Luxembourg','LU','LUX'],['Madagascar','MG','MDG'],['Malawi','MW','MWI'],['Malaysia','MY','MYS'],
  ['Maldives','MV','MDV'],['Mali','ML','MLI'],['Malta','MT','MLT'],['Marshall Islands','MH','MHL'],
  ['Mauritania','MR','MRT'],['Mauritius','MU','MUS'],['Mexico','MX','MEX'],['Micronesia','FM','FSM'],
  ['Moldova','MD','MDA'],['Monaco','MC','MCO'],['Mongolia','MN','MNG'],['Montenegro','ME','MNE'],
  ['Morocco','MA','MAR'],['Mozambique','MZ','MOZ'],['Myanmar','MM','MMR'],['Namibia','NA','NAM'],
  ['Nauru','NR','NRU'],['Nepal','NP','NPL'],['Netherlands','NL','NLD'],['New Zealand','NZ','NZL'],
  ['Nicaragua','NI','NIC'],['Niger','NE','NER'],['Nigeria','NG','NGA'],['North Korea','KP','PRK'],
  ['North Macedonia','MK','MKD'],['Norway','NO','NOR'],['Oman','OM','OMN'],['Pakistan','PK','PAK'],
  ['Palau','PW','PLW'],['Palestine','PS','PSE'],['Panama','PA','PAN'],['Papua New Guinea','PG','PNG'],
  ['Paraguay','PY','PRY'],['Peru','PE','PER'],['Philippines','PH','PHL'],['Poland','PL','POL'],
  ['Portugal','PT','PRT'],['Qatar','QA','QAT'],['Romania','RO','ROU'],['Russia','RU','RUS'],
  ['Rwanda','RW','RWA'],['Saint Kitts and Nevis','KN','KNA'],['Saint Lucia','LC','LCA'],
  ['Saint Vincent and the Grenadines','VC','VCT'],['Samoa','WS','WSM'],['San Marino','SM','SMR'],
  ['Sao Tome and Principe','ST','STP'],['Saudi Arabia','SA','SAU'],['Senegal','SN','SEN'],
  ['Serbia','RS','SRB'],['Seychelles','SC','SYC'],['Sierra Leone','SL','SLE'],['Singapore','SG','SGP'],
  ['Slovakia','SK','SVK'],['Slovenia','SI','SVN'],['Solomon Islands','SB','SLB'],['Somalia','SO','SOM'],
  ['South Africa','ZA','ZAF'],['South Korea','KR','KOR'],['South Sudan','SS','SSD'],['Spain','ES','ESP'],
  ['Sri Lanka','LK','LKA'],['Sudan','SD','SDN'],['Suriname','SR','SUR'],['Sweden','SE','SWE'],
  ['Switzerland','CH','CHE'],['Syria','SY','SYR'],['Taiwan','TW','TWN'],['Tajikistan','TJ','TJK'],
  ['Tanzania','TZ','TZA'],['Thailand','TH','THA'],['Timor-Leste','TL','TLS'],['Togo','TG','TGO'],
  ['Tonga','TO','TON'],['Trinidad and Tobago','TT','TTO'],['Tunisia','TN','TUN'],['Turkey','TR','TUR'],
  ['Turkmenistan','TM','TKM'],['Tuvalu','TV','TUV'],['Uganda','UG','UGA'],['Ukraine','UA','UKR'],
  ['United Arab Emirates','AE','ARE'],['United Kingdom','GB','GBR'],['United States','US','USA'],
  ['Uruguay','UY','URY'],['Uzbekistan','UZ','UZB'],['Vanuatu','VU','VUT'],['Vatican City','VA','VAT'],
  ['Venezuela','VE','VEN'],['Vietnam','VN','VNM'],['Yemen','YE','YEM'],['Zambia','ZM','ZMB'],
  ['Zimbabwe','ZW','ZWE'],['Hong Kong','HK','HKG'],['Macau','MO','MAC'],['Puerto Rico','PR','PRI'],
];

// Extra spellings/abbreviations people actually type → alpha-3
const COUNTRY_ALIASES = {
  'usa':'USA','u.s.':'USA','u.s.a.':'USA','united states of america':'USA','america':'USA',
  'uk':'GBR','u.k.':'GBR','great britain':'GBR','britain':'GBR','england':'GBR','scotland':'GBR','wales':'GBR',
  'uae':'ARE','emirates':'ARE','dubai':'ARE','abu dhabi':'ARE',
  'drc':'COD','dr congo':'COD','democratic republic of the congo':'COD','republic of the congo':'COG',
  'south korea':'KOR','korea':'KOR','north korea':'PRK','czech republic':'CZE','holland':'NLD',
  'russia':'RUS','russian federation':'RUS','vietnam':'VNM','laos':'LAO','syria':'SYR','iran':'IRN',
  'tanzania':'TZA','venezuela':'VEN','bolivia':'BOL','moldova':'MDA','brunei':'BRN','cape verde':'CPV',
  'ivory coast':'CIV','cote d\'ivoire':'CIV','swaziland':'SWZ','burma':'MMR','macedonia':'MKD',
  'vatican':'VAT','palestine':'PSE','turkiye':'TUR','türkiye':'TUR',
};

// US states + DC (2-letter)
const US_STATE_TABLE = [
  ['Alabama','AL'],['Alaska','AK'],['Arizona','AZ'],['Arkansas','AR'],['California','CA'],['Colorado','CO'],
  ['Connecticut','CT'],['Delaware','DE'],['Florida','FL'],['Georgia','GA'],['Hawaii','HI'],['Idaho','ID'],
  ['Illinois','IL'],['Indiana','IN'],['Iowa','IA'],['Kansas','KS'],['Kentucky','KY'],['Louisiana','LA'],
  ['Maine','ME'],['Maryland','MD'],['Massachusetts','MA'],['Michigan','MI'],['Minnesota','MN'],
  ['Mississippi','MS'],['Missouri','MO'],['Montana','MT'],['Nebraska','NE'],['Nevada','NV'],
  ['New Hampshire','NH'],['New Jersey','NJ'],['New Mexico','NM'],['New York','NY'],['North Carolina','NC'],
  ['North Dakota','ND'],['Ohio','OH'],['Oklahoma','OK'],['Oregon','OR'],['Pennsylvania','PA'],
  ['Rhode Island','RI'],['South Carolina','SC'],['South Dakota','SD'],['Tennessee','TN'],['Texas','TX'],
  ['Utah','UT'],['Vermont','VT'],['Virginia','VA'],['Washington','WA'],['West Virginia','WV'],
  ['Wisconsin','WI'],['Wyoming','WY'],['District of Columbia','DC'],['Washington DC','DC'],['Washington, D.C.','DC'],
];

// A few common international production cities → country alpha-3 (cities abroad are
// typed manually, but these save a step). US cities use CITY_STATE from tc-logic.
const INTL_CITIES = {
  // United Kingdom & Ireland
  'london':'GBR','edinburgh':'GBR','glasgow':'GBR','liverpool':'GBR','leeds':'GBR','bristol':'GBR',
  'cardiff':'GBR','belfast':'GBR','dublin':'IRL','cork':'IRL','galway':'IRL',
  // France
  'paris':'FRA','marseille':'FRA','lyon':'FRA','nice':'FRA','cannes':'FRA','bordeaux':'FRA',
  'toulouse':'FRA','lille':'FRA','nantes':'FRA','strasbourg':'FRA',
  // Germany / Austria / Switzerland
  'berlin':'DEU','munich':'DEU','hamburg':'DEU','frankfurt':'DEU','cologne':'DEU','stuttgart':'DEU',
  'dusseldorf':'DEU','leipzig':'DEU','vienna':'AUT','salzburg':'AUT','innsbruck':'AUT',
  'zurich':'CHE','geneva':'CHE','bern':'CHE','basel':'CHE','lausanne':'CHE',
  // Iberia
  'madrid':'ESP','barcelona':'ESP','valencia':'ESP','seville':'ESP','malaga':'ESP','bilbao':'ESP',
  'granada':'ESP','lisbon':'PRT','porto':'PRT','faro':'PRT',
  // Italy
  'rome':'ITA','milan':'ITA','naples':'ITA','turin':'ITA','florence':'ITA','venice':'ITA',
  'bologna':'ITA','palermo':'ITA',
  // Benelux
  'amsterdam':'NLD','rotterdam':'NLD','the hague':'NLD','utrecht':'NLD',
  'brussels':'BEL','antwerp':'BEL','bruges':'BEL','ghent':'BEL','luxembourg':'LUX',
  // Nordics
  'stockholm':'SWE','gothenburg':'SWE','malmo':'SWE','oslo':'NOR','bergen':'NOR','tromso':'NOR',
  'copenhagen':'DNK','aarhus':'DNK','helsinki':'FIN','reykjavik':'ISL','reykjavík':'ISL',
  // Central & Eastern Europe
  'prague':'CZE','brno':'CZE','warsaw':'POL','krakow':'POL','gdansk':'POL','wroclaw':'POL',
  'budapest':'HUN','bucharest':'ROU','zagreb':'HRV','dubrovnik':'HRV','split':'HRV',
  'belgrade':'SRB','ljubljana':'SVN','bratislava':'SVK','sofia':'BGR','tallinn':'EST',
  'riga':'LVA','vilnius':'LTU','kyiv':'UKR','kiev':'UKR','lviv':'UKR','odesa':'UKR',
  'moscow':'RUS','st. petersburg':'RUS','saint petersburg':'RUS',
  // Greece / Turkey / Caucasus
  'athens':'GRC','thessaloniki':'GRC','mykonos':'GRC','istanbul':'TUR','ankara':'TUR','izmir':'TUR',
  'antalya':'TUR','tbilisi':'GEO','yerevan':'ARM','baku':'AZE',
  // Middle East
  'dubai':'ARE','abu dhabi':'ARE','doha':'QAT','riyadh':'SAU','jeddah':'SAU','tel aviv':'ISR',
  'jerusalem':'ISR','haifa':'ISR','amman':'JOR','beirut':'LBN','kuwait city':'KWT','manama':'BHR',
  'muscat':'OMN',
  // Africa
  'cairo':'EGY','alexandria':'EGY','giza':'EGY','luxor':'EGY','marrakech':'MAR','casablanca':'MAR',
  'rabat':'MAR','fes':'MAR','tangier':'MAR','tunis':'TUN','algiers':'DZA',
  'cape town':'ZAF','johannesburg':'ZAF','durban':'ZAF','pretoria':'ZAF',
  'nairobi':'KEN','mombasa':'KEN','lagos':'NGA','abuja':'NGA','accra':'GHA','addis ababa':'ETH',
  'dar es salaam':'TZA','arusha':'TZA','zanzibar':'TZA','kampala':'UGA','kigali':'RWA',
  'antananarivo':'MDG','windhoek':'NAM','gaborone':'BWA','dakar':'SEN','lusaka':'ZMB','harare':'ZWE',
  // South Asia
  'mumbai':'IND','new delhi':'IND','delhi':'IND','bangalore':'IND','bengaluru':'IND','chennai':'IND',
  'kolkata':'IND','hyderabad':'IND','jaipur':'IND','goa':'IND','karachi':'PAK','lahore':'PAK',
  'islamabad':'PAK','dhaka':'BGD','colombo':'LKA','kathmandu':'NPL','male':'MDV',
  // Southeast Asia
  'bangkok':'THA','chiang mai':'THA','phuket':'THA','hanoi':'VNM','ho chi minh city':'VNM','saigon':'VNM',
  'da nang':'VNM','phnom penh':'KHM','siem reap':'KHM','vientiane':'LAO','yangon':'MMR',
  'kuala lumpur':'MYS','penang':'MYS','kota kinabalu':'MYS','singapore':'SGP',
  'jakarta':'IDN','bali':'IDN','denpasar':'IDN','ubud':'IDN','surabaya':'IDN','bandung':'IDN',
  'manila':'PHL','cebu':'PHL','davao':'PHL',
  // East Asia
  'tokyo':'JPN','osaka':'JPN','kyoto':'JPN','yokohama':'JPN','nagoya':'JPN','sapporo':'JPN',
  'fukuoka':'JPN','okinawa':'JPN','hiroshima':'JPN','seoul':'KOR','busan':'KOR','incheon':'KOR',
  'beijing':'CHN','shanghai':'CHN','guangzhou':'CHN','shenzhen':'CHN','chengdu':'CHN','hangzhou':'CHN',
  'xian':'CHN','chongqing':'CHN','hong kong':'HKG','macau':'MAC','taipei':'TWN','taichung':'TWN',
  'kaohsiung':'TWN','ulaanbaatar':'MNG','almaty':'KAZ','astana':'KAZ','tashkent':'UZB','samarkand':'UZB',
  // Oceania
  'sydney':'AUS','melbourne':'AUS','brisbane':'AUS','perth':'AUS','adelaide':'AUS','gold coast':'AUS',
  'canberra':'AUS','cairns':'AUS','darwin':'AUS','hobart':'AUS','auckland':'NZL','wellington':'NZL',
  'christchurch':'NZL','queenstown':'NZL','suva':'FJI','nadi':'FJI',
  // Latin America & Caribbean
  'mexico city':'MEX','cancun':'MEX','guadalajara':'MEX','monterrey':'MEX','playa del carmen':'MEX',
  'tulum':'MEX','oaxaca':'MEX','puerto vallarta':'MEX','rio de janeiro':'BRA','sao paulo':'BRA',
  'brasilia':'BRA','salvador':'BRA','buenos aires':'ARG','cordoba':'ARG','mendoza':'ARG',
  'santiago':'CHL','valparaiso':'CHL','bogota':'COL','medellin':'COL','cartagena':'COL',
  'lima':'PER','cusco':'PER','quito':'ECU','guayaquil':'ECU','montevideo':'URY','la paz':'BOL',
  'panama city':'PAN','guatemala city':'GTM','havana':'CUB','santo domingo':'DOM','san juan':'PRI',
  'kingston':'JAM','nassau':'BHS','bridgetown':'BRB',
};

// ── build lookups ────────────────────────────────────────────────────────────
const COUNTRY_BY_NAME = {};   // lowercased name/alias → alpha-3
const COUNTRY_A2 = {};        // alpha-2 → alpha-3
const COUNTRY_A3_SET = new Set();
const COUNTRY_NAMES = [];     // Title-case names for datalist
for (const [name, a2, a3] of COUNTRY_TABLE) {
  COUNTRY_BY_NAME[name.toLowerCase()] = a3;
  COUNTRY_A2[a2] = a3;
  COUNTRY_A3_SET.add(a3);
  COUNTRY_NAMES.push(name);
}
Object.assign(COUNTRY_BY_NAME, COUNTRY_ALIASES);

const US_STATE_BY_NAME = {};  // lowercased name → 2-letter
const US_STATE_SET = new Set();
const US_STATE_NAMES = [];
for (const [name, code] of US_STATE_TABLE) {
  US_STATE_BY_NAME[name.toLowerCase()] = code;
  US_STATE_SET.add(code);
  if (!/dc|d\.c\./i.test(name) || name === 'District of Columbia') US_STATE_NAMES.push(name);
}

// Normalize whatever is typed in the State box → proper code.
// US state name → 2-letter · country name/alias → 3-letter · 2-letter country code → 3-letter.
// US states win 2-letter ties (this DP works in the US most weeks).
function normalizeRegion(input) {
  if (!input) return '';
  const s = String(input).trim();
  if (!s) return '';
  const low = s.toLowerCase();
  if (US_STATE_BY_NAME[low]) return US_STATE_BY_NAME[low];     // "California" → CA
  if (COUNTRY_BY_NAME[low]) return COUNTRY_BY_NAME[low];        // "Ghana" → GHA
  const up = s.toUpperCase().replace(/[^A-Z]/g, '');
  if (up.length === 2) {
    if (US_STATE_SET.has(up)) return up;                       // "CA" stays CA
    if (COUNTRY_A2[up]) return COUNTRY_A2[up];                  // "GH" → GHA
    return up;
  }
  if (up.length === 3) {
    if (COUNTRY_A3_SET.has(up)) return up;                     // "GHA" stays GHA
    return up;
  }
  return s;   // unknown longer text — leave as typed
}

// City → region code. US city → 2-letter state · known intl city → 3-letter country.
function lookupRegion(city) {
  if (!city) return '';
  const low = String(city).trim().toLowerCase();
  if (CITY_STATE[low]) return CITY_STATE[low];
  if (INTL_CITIES[low]) return INTL_CITIES[low];
  return '';
}

// Options for the State box datalist (state names + country names).
const REGION_OPTIONS = [...US_STATE_NAMES, ...COUNTRY_NAMES];

Object.assign(window, {
  normalizeRegion, lookupRegion, REGION_OPTIONS,
  COUNTRY_BY_NAME, COUNTRY_A2, COUNTRY_A3_SET, US_STATE_BY_NAME, US_STATE_SET, INTL_CITIES,
});
