require "net/https"
require "uri"
require "cgi"
require "json"

class RemoteTranslations::Microsoft::AvailableLocales
  def self.locales
    daily_cache("locales") do
      remote_available_locales.map { |locale| remote_locale_to_app_locale(locale) }
    end
  end

  def self.app_locale_to_remote_locale(locale)
    app_locale_to_remote_locale_map[locale] || locale
  end

  def self.include_locale?(locale)
    locales.include?(locale.to_s)
  end

  private

    def self.remote_locale_to_app_locale(locale)
      app_locale_to_remote_locale_map.invert[locale] || locale
    end

    def self.app_locale_to_remote_locale_map
      {
        "pt-BR" => "pt",
        "zh-CN" => "zh-Hans",
        "zh-TW" => "zh-Hant"
      }
    end

    def self.remote_available_locales
      host = "https://api.cognitive.microsofttranslator.com"
      path = "/languages?api-version=3.0"

      uri = URI(host + path)

      request = Net::HTTP::Get.new(uri)
      request["Ocp-Apim-Subscription-Key"] = Tenant.current_secrets.microsoft_api_key

      response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") do |http|
        http.request(request)
      end

      result = response.body.force_encoding("utf-8")

      JSON.parse(result)["translation"].map(&:first)
    end

    def self.daily_cache(key, &)
      Rails.cache.fetch("remote_available_locales/#{Time.current.strftime("%Y-%m-%d")}/#{key}", &)
    end
end
