# "bn_BD"   => load_locale("bn_BD"),   # Bengali (Bangladesh)  [Incomplete]
# "eu"      => load_locale("eu"),      # Basque  [Incomplete]
# "si"      => load_locale("si"),      # Sinhala  [Incomplete]
# "sk"      => load_locale("sk"),      # Slovak  [Incomplete]
# "sr"      => load_locale("sr"),      # Serbian  [Incomplete]
# "sr_Cyrl" => load_locale("sr_Cyrl"), # Serbian (cyrillic)  [Incomplete]
LOCALES = {
  "ar"    => load_locale("ar"),    # Arabic
  "cs"    => load_locale("cs"),    # Czech
  "da"    => load_locale("da"),    # Danish
  "de"    => load_locale("de"),    # German
  "el"    => load_locale("el"),    # Greek
  "en-US" => load_locale("en-US"), # English (US)
  "eo"    => load_locale("eo"),    # Esperanto
  "es"    => load_locale("es"),    # Spanish
  "fa"    => load_locale("fa"),    # Persian
  "fi"    => load_locale("fi"),    # Finnish
  "fr"    => load_locale("fr"),    # French
  "he"    => load_locale("he"),    # Hebrew
  "hr"    => load_locale("hr"),    # Croatian
  "hu-HU" => load_locale("hu-HU"), # Hungarian
  "id"    => load_locale("id"),    # Indonesian
  "is"    => load_locale("is"),    # Icelandic
  "it"    => load_locale("it"),    # Italian
  "ja"    => load_locale("ja"),    # Japanese
  "ko"    => load_locale("ko"),    # Korean
  "lt"    => load_locale("lt"),    # Lithuanian
  "nb-NO" => load_locale("nb-NO"), # Norwegian BokmÃ¥l
  "nl"    => load_locale("nl"),    # Dutch
  "pl"    => load_locale("pl"),    # Polish
  "pt"    => load_locale("pt"),    # Portuguese
  "pt-BR" => load_locale("pt-BR"), # Portuguese (Brazil)
  "pt-PT" => load_locale("pt-PT"), # Portuguese (Portugal)
  "ro"    => load_locale("ro"),    # Romanian
  "ru"    => load_locale("ru"),    # Russian
  "sv-SE" => load_locale("sv-SE"), # Swedish
  "tr"    => load_locale("tr"),    # Turkish
  "uk"    => load_locale("uk"),    # Ukrainian
  "vi"    => load_locale("vi"),    # Vietnamese
  "zh-CN" => load_locale("zh-CN"), # Chinese (Simplified)
  "zh-TW" => load_locale("zh-TW"), # Chinese (Traditional)
}

def load_locale(name)
  return JSON.parse(File.read("locales/#{name}.json")).as_h
end

def translate(locale : Hash(String, JSON::Any) | Nil, translation : String, text : String | Nil = nil)
  # if locale && !locale[translation]?
  #   puts "Could not find translation for #{translation.dump}"
  # end

  if locale && locale[translation]?
    case locale[translation]
    when .as_h?
      match_length = 0

      locale[translation].as_h.each do |key, value|
        if md = text.try &.match(/#{key}/)
          if md[0].size >= match_length
            translation = value.as_s
            match_length = md[0].size
          end
        end
      end
    when .as_s?
      if !locale[translation].as_s.empty?
        translation = locale[translation].as_s
      end
    else
      raise "Invalid translation #{translation}"
    end
  end

  if text
    translation = translation.gsub("`x`", text)
  end

  return translation
end

def translate_bool(locale : Hash(String, JSON::Any) | Nil, translation : Bool)
  case translation
  when true
    return translate(locale, "Yes")
  when false
    return translate(locale, "No")
  end
end
