require 'net/http' require 'uri' require 'csv'

def fetch_with_redirect(uri_str, limit = 10)

raise ArgumentError, 'HTTP redirect too deep' if limit == 0

url = URI.parse(uri_str)
response = Net::HTTP.start(url.host, url.port, use_ssl: true) { |http| http.get(url.path + (url.query ? "?#{url.query}" : "")) }
case response
when Net::HTTPRedirection then fetch_with_redirect(response['location'], limit - 1)
when Net::HTTPSuccess     then response
else
  response.error!
end

end

namespace :wigodo do

desc 'Import translations from Google Drive'
task :fetch do
  document_id = Rails.application.secrets.wigodo_doc_id || Rails.application.credentials.wigodo_doc_id

  unless document_id
    abort("i18n-wigodo: wigodo_doc_id not set!\n" +
          "Add the id of your Google Doc spreadsheet to\n" +
          "config/credentials.yml (Rails < 5.2: config/secrets.yml).\n" +
          "Use wigodo_doc_id as key.\n\n" +
          "Example:\n\n" +
          "wigodo_doc_id: 1en5BoKGaAqO9_BRSQ9CQKkvwrYQWNBUPjgSzxyn83Pc\n\n" +
          "(This is the id of a sample document your can check out here:\n" +
          "https://docs.google.com/spreadsheets/d/1en5BoKGaAqO9_BRSQ9CQKkvwrYQWNBUPjgSzxyn83Pc/edit#gid=0")
  end

  resp = fetch_with_redirect("https://docs.google.com/spreadsheets/d/#{document_id}/export?format=csv")

  # puts resp.body.force_encoding('UTF-8')
  rows = CSV.parse(resp.body.force_encoding('UTF-8'))
  locales = rows.first[2..-1]
  default_locale_index = 2

  hash = {}
  locales.each do |locale|
    locale_index = locales.find_index(locale) + 2
    hash[locale] = {}
    rows[1..-1].each do |cols|
      if cols.first.present?
        last_item = hash[locale]
        keys = cols.first.split('.')
        keys[0..-2].each do |key|
          last_item = last_item[key] ||= {}
        end
        content = cols[locale_index]
        default_content = cols[default_locale_index]
        last_item[keys[-1]] = content.present? ? content : default_content
      end
    end

    filename = "#{Rails.root}/config/locales/remote.#{locale}.yml"
    print "generating #{filename}..."
    File.open(filename, "w") do |f|
      f.write({locale => hash[locale]}.to_yaml)
    end
    puts "OK"
  end
end

desc 'Output a CSV style file with existing translations (to be imported into Google Spreadsheets)'
task export: :environment do
  require 'yaml'
  #I18n.locale = :en
  de_input = YAML.load(IO.readlines('config/locales/de.yml').join("\n"))
  input = YAML.load(IO.readlines('config/locales/en.yml').join("\n"))
  def make_hash_one_dimensional(input = {}, output = {}, options = {})
    input.each do |key, value|
      key = options[:prefix].nil? ? "#{key}" : "#{options[:prefix]}.#{key}"
      if value.is_a? Hash
        make_hash_one_dimensional(value, output, :prefix => key)
      else
        output[key]  = value
      end
    end
    output
  end

  output = {}
  make_hash_one_dimensional(input, output)

  output_de = {}
  make_hash_one_dimensional(de_input, output_de)
  output_de = output_de.sort.to_h

  output.sort.to_h.each do |k, v|
    v = v.tr("\n", ' ')
    wol = "de." + k[3..-1]
    de = output_de[wol] ? "\t" + output_de[wol] : nil
    puts "#{k}\t#{v}#{de}"
  end
end

end