require "json"
require "terminal-table"

bangs_json = JSON.parse(File.read("data/bangs.json"))
kagi_bangs_json = JSON.parse(File.read("data/kagi_bangs.json"))
assist_bangs_json = JSON.parse(File.read("data/assistant_bangs.json"))

regions = [
  "no_region", "ac", "ad", "ae", "af", "ag", "ai", "al", "am", "ao", "aq", "ar", "as", "at", "au", "aw", "ax", "az", "ba", "bb", "bd", "be", "be_fr", "bf", "bg", "bh", "bi", "bj", "bl", "bm", "bn", "bo", "bq", "br", "bs", "bt", "bv", "bw", "by", "bz", "ca", "ca_fr", "cc", "cd", "cf", "cg", "ch", "ch_fr", "ci", "ck", "cl", "cm", "cn", "co", "cr", "cu", "cv", "cw", "cx", "cy", "cz", "de", "dj", "dk", "dm", "do", "dz", "ec", "ee", "eg", "eh", "er", "es", "es_ca", "et", "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", "sd", "se", "sg", "sh", "si", "sj", "sk", "sl", "sm", "sn", "so", "sr", "ss", "st", "sv", "sx", "sy", "sz", "ta", "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", "wf", "ws", "xk", "ye", "yt", "za", "zm", "zw",
]

region_names = {
  "ac" => "Ascension Island (AC)",
  "ad" => "Andorra (AD)",
  "ae" => "United Arab Emirates (AE)",
  "af" => "Afghanistan (AF)",
  "ag" => "Antigua and Barbuda (AG)",
  "ai" => "Anguilla (AI)",
  "al" => "Albania (AL)",
  "am" => "Armenia (AM)",
  "ao" => "Angola (AO)",
  "aq" => "Antarctica (AQ)",
  "ar" => "Argentina (AR)",
  "as" => "American Samoa (AS)",
  "at" => "Austria (AT)",
  "au" => "Australia (AU)",
  "aw" => "Aruba (AW)",
  "ax" => "Åland Islands (AX)",
  "az" => "Azerbaijan (AZ)",
  "ba" => "Bosnia and Herzegovina (BA)",
  "bb" => "Barbados (BB)",
  "bd" => "Bangladesh (BD)",
  "be" => "Belgium (BE - nl)",
  "be_fr" => "Belgium (BE - fr)",
  "bf" => "Burkina Faso (BF)",
  "bg" => "Bulgaria (BG)",
  "bh" => "Bahrain (BH)",
  "bi" => "Burundi (BI)",
  "bj" => "Benin (BJ)",
  "bl" => "Saint Barthélemy (BL)",
  "bm" => "Bermuda (BM)",
  "bn" => "Brunei (BN)", # "Brunei Darussalam",
  "bo" => "Bolivia (BO)", # "Bolivia (Plurinational State of)",
  "bq" => "Bonaire, Sint Eustatius and Saba (BQ)",
  "br" => "Brazil (BR)",
  "bs" => "Bahamas (BS)",
  "bt" => "Bhutan (BT)",
  "bv" => "Bouvet Island (BV)",
  "bw" => "Botswana (BW)",
  "by" => "Belarus (BY)",
  "bz" => "Belize (BZ)",
  "ca" => "Canada (CA - en)",
  "ca_fr" => "Canada (CA - fr)",
  "cc" => "Cocos (Keeling) Islands (CC)",
  "cd" => "Congo, Democratic Republic of the (CD)",
  "cf" => "Central African Republic (CF)",
  "cg" => "Congo (CG)",
  "ch" => "Switzerland (CH - de)",
  "ch_fr" => "Switzerland (CH - fr)",
  "ci" => "Côte d'Ivoire (CI)",
  "ck" => "Cook Islands (CK)",
  "cl" => "Chile (CL)",
  "cm" => "Cameroon (CM)",
  "cn" => "China (CN)",
  "co" => "Colombia (CO)",
  "cr" => "Costa Rica (CR)",
  "cu" => "Cuba (CU)",
  "cv" => "Cabo Verde (CV)",
  "cw" => "Curaçao (CW)",
  "cx" => "Christmas Island (CX)",
  "cy" => "Cyprus (CY)",
  "cz" => "Czechia (CZ)",
  "de" => "Germany (DE)",
  "dj" => "Djibouti (DJ)",
  "dk" => "Denmark (DK)",
  "dm" => "Dominica (DM)",
  "do" => "Dominican Republic (DO)",
  "dz" => "Algeria (DZ)",
  "ec" => "Ecuador (EC)",
  "ee" => "Estonia (EE)",
  "eg" => "Egypt (EG)",
  "eh" => "Western Sahara (EH)",
  "er" => "Eritrea (ER)",
  "es" => "Spain (ES - es)",
  "es_ca" => "Spain (ES - ca)",
  "et" => "Ethiopia (ET)",
  "fi" => "Finland (FI)",
  "fj" => "Fiji (FJ)",
  "fk" => "Falkland Islands (FK)", # "Falkland Islands (Malvinas)",
  "fm" => "Micronesia (Federated States of) (FM)",
  "fo" => "Faroe Islands (FO)",
  "fr" => "France (FR)",
  "ga" => "Gabon (GA)",
  "gb" => "United Kingdom (GB)", # "United Kingdom of Great Britain and Northern Ireland",
  "gd" => "Grenada (GD)",
  "ge" => "Georgia (GE)",
  "gf" => "French Guiana (GF)",
  "gg" => "Guernsey (GG)",
  "gh" => "Ghana (GH)",
  "gi" => "Gibraltar (GI)",
  "gl" => "Greenland (GL)",
  "gm" => "Gambia (GM)",
  "gn" => "Guinea (GN)",
  "gp" => "Guadeloupe (GP)",
  "gq" => "Equatorial Guinea (GQ)",
  "gr" => "Greece (GR)",
  "gs" => "South Georgia and the South Sandwich Islands (GS)",
  "gt" => "Guatemala (GT)",
  "gu" => "Guam (GU)",
  "gw" => "Guinea-Bissau (GW)",
  "gy" => "Guyana (GY)",
  "hk" => "Hong Kong (HK)",
  "hm" => "Heard Island and McDonald Islands (HM)",
  "hn" => "Honduras (HN)",
  "hr" => "Croatia (HR)",
  "ht" => "Haiti (HT)",
  "hu" => "Hungary (HU)",
  "id" => "Indonesia (ID)",
  "ie" => "Ireland (IE)",
  "il" => "Israel (IL)",
  "im" => "Isle of Man (IM)",
  "in" => "India (IN)",
  "io" => "British Indian Ocean Territory (IO)",
  "iq" => "Iraq (IQ)",
  "ir" => "Iran (IR)", # "Iran (Islamic Republic of)",
  "is" => "Iceland (IS)",
  "it" => "Italy (IT)",
  "je" => "Jersey (JE)",
  "jm" => "Jamaica (JM)",
  "jo" => "Jordan (JO)",
  "jp" => "Japan (JP)",
  "ke" => "Kenya (KE)",
  "kg" => "Kyrgyzstan (KG)",
  "kh" => "Cambodia (KH)",
  "ki" => "Kiribati (KI)",
  "km" => "Comoros (KM)",
  "kn" => "Saint Kitts and Nevis (KN)",
  "kp" => "North Korea (KP)", # "Korea (Democratic People's Republic of)",
  "kr" => "South Korea (KR)", # "Korea, Republic of",
  "kw" => "Kuwait (KW)",
  "ky" => "Cayman Islands (KY)",
  "kz" => "Kazakhstan (KZ)",
  "la" => "Laos (LA)", # "Lao People's Democratic Republic",
  "lb" => "Lebanon (LB)",
  "lc" => "Saint Lucia (LC)",
  "li" => "Liechtenstein (LI)",
  "lk" => "Sri Lanka (LK)",
  "lr" => "Liberia (LR)",
  "ls" => "Lesotho (LS)",
  "lt" => "Lithuania (LT)",
  "lu" => "Luxembourg (LU)",
  "lv" => "Latvia (LV)",
  "ly" => "Libya (LY)",
  "ma" => "Morocco (MA)",
  "mc" => "Monaco (MC)",
  "md" => "Moldova (MD)", # "Moldova, Republic of",
  "me" => "Montenegro (ME)",
  "mf" => "Saint Martin (MF)", # "Saint Martin (French part)",
  "mg" => "Madagascar (MG)",
  "mh" => "Marshall Islands (MH)",
  "mk" => "North Macedonia (MK)",
  "ml" => "Mali (ML)",
  "mm" => "Myanmar (MM)",
  "mn" => "Mongolia (MN)",
  "mo" => "Macao (MO)",
  "mp" => "Northern Mariana Islands (MP)",
  "mq" => "Martinique (MQ)",
  "mr" => "Mauritania (MR)",
  "ms" => "Montserrat (MS)",
  "mt" => "Malta (MT)",
  "mu" => "Mauritius (MU)",
  "mv" => "Maldives (MV)",
  "mw" => "Malawi (MW)",
  "mx" => "Mexico (MX)",
  "my" => "Malaysia (MY)",
  "mz" => "Mozambique (MZ)",
  "na" => "Namibia (NA)",
  "nc" => "New Caledonia (NC)",
  "ne" => "Niger (NE)",
  "nf" => "Norfolk Island (NF)",
  "ng" => "Nigeria (NG)",
  "ni" => "Nicaragua (NI)",
  "nl" => "Netherlands (NL)",
  "no" => "Norway (NO)",
  "np" => "Nepal (NP)",
  "nr" => "Nauru (NR)",
  "nu" => "Niue (NU)",
  "nz" => "New Zealand (NZ)",
  "om" => "Oman (OM)",
  "pa" => "Panama (PA)",
  "pe" => "Peru (PE)",
  "pf" => "French Polynesia (PF)",
  "pg" => "Papua New Guinea (PG)",
  "ph" => "Philippines (PH)",
  "pk" => "Pakistan (PK)",
  "pl" => "Poland (PL)",
  "pm" => "Saint Pierre and Miquelon (PM)",
  "pn" => "Pitcairn (PN)",
  "pr" => "Puerto Rico (PR)",
  "ps" => "Palestine (PS)", # "Palestine, State of",
  "pt" => "Portugal (PT)",
  "pw" => "Palau (PW)",
  "py" => "Paraguay (PY)",
  "qa" => "Qatar (QA)",
  "re" => "Réunion (RE)",
  "ro" => "Romania (RO)",
  "rs" => "Serbia (RS)",
  "ru" => "Russia (RU)", # "Russian Federation",
  "rw" => "Rwanda (RW)",
  "sa" => "Saudi Arabia (SA)",
  "sb" => "Solomon Islands (SB)",
  "sc" => "Seychelles (SC)",
  "sd" => "Sudan (SD)",
  "se" => "Sweden (SE)",
  "sg" => "Singapore (SG)",
  "sh" => "Saint Helena, Ascension and Tristan da Cunha (SH)",
  "si" => "Slovenia (SI)",
  "sj" => "Svalbard and Jan Mayen (SJ)",
  "sk" => "Slovakia (SK)",
  "sl" => "Sierra Leone (SL)",
  "sm" => "San Marino (SM)",
  "sn" => "Senegal (SN)",
  "so" => "Somalia (SO)",
  "sr" => "Suriname (SR)",
  "ss" => "South Sudan (SS)",
  "st" => "Sao Tome and Principe (ST)",
  "sv" => "El Salvador (SV)",
  "sx" => "Sint Maarten (SX)", # "Sint Maarten (Dutch part)",
  "sy" => "Syria (SY)", # "Syrian Arab Republic",
  "sz" => "Eswatini (SZ)",
  "ta" => "Tristan da Cunha (TA)",
  "tc" => "Turks and Caicos Islands (TC)",
  "td" => "Chad (TD)",
  "tf" => "French Southern Territories (TF)",
  "tg" => "Togo (TG)",
  "th" => "Thailand (TH)",
  "tj" => "Tajikistan (TJ)",
  "tk" => "Tokelau (TK)",
  "tl" => "Timor-Leste (TL)",
  "tm" => "Turkmenistan (TM)",
  "tn" => "Tunisia (TN)",
  "to" => "Tonga (TO)",
  "tr" => "Turkey (TR)", # "Türkiye",
  "tt" => "Trinidad and Tobago (TT)",
  "tv" => "Tuvalu (TV)",
  "tw" => "Taiwan (TW)", # "Taiwan, Province of China",
  "tz" => "Tanzania (TZ)", # "Tanzania, United Republic of",
  "ua" => "Ukraine (UA)",
  "ug" => "Uganda (UG)",
  "um" => "United States Minor Outlying Islands (UM)",
  "us" => "United States (US)", # "United States of America",
  "uy" => "Uruguay (UY)",
  "uz" => "Uzbekistan (UZ)",
  "va" => "Vatican City (VA)", # "Holy See",
  "vc" => "Saint Vincent and the Grenadines (VC)",
  "ve" => "Venezuela (VE)", # "Venezuela (Bolivarian Republic of)",
  "vg" => "British Virgin Islands (VG)", # "Virgin Islands (British)",
  "vi" => "United States Virgin Islands (VI)", # "Virgin Islands (U.S.)",
  "vn" => "Vietnam (VN)", # "Viet Nam",
  "vu" => "Vanuatu (VU)",
  "wf" => "Wallis and Futuna (WF)",
  "ws" => "Samoa (WS)",
  "xk" => "Kosovo (XK)",
  "ye" => "Yemen (YE)",
  "yt" => "Mayotte (YT)",
  "za" => "South Africa (ZA)",
  "zm" => "Zambia (ZM)",
  "zw" => "Zimbabwe (ZW)"
}

region_bangs = [["Trigger", "Site", "Category", "Region"], ["-", "-", "-", "-"]]

regions.each do |region|
  if (b = bangs_json.select {|b| b["t"] == region }[0]) && (!b["s"].start_with?("Search in"))
    region_bangs << [region, b["s"], b["c"], region_names[region]]
  elsif (b = kagi_bangs_json.select {|b| b["t"] == region }[0]) && (!b["s"].start_with?("Search in"))
    region_bangs << [region, b["s"], b["c"], region_names[region]]
  elsif (b = assist_bangs_json.select {|b| b["t"] == region }[0]) && (!b["s"].start_with?("Search in"))
    region_bangs << [region, b["s"], b["c"], region_names[region]]
  end
end

puts Terminal::Table.new :rows => region_bangs
