#!/usr/bin/env ruby

require_relative '../lib/portal_ship'
require 'net/http'
require 'json'
require 'colorize'
require 'optparse'

options = {}
OptionParser.new do |opts|
  opts.banner = "Usage: example.rb [options]"

  opts.on("-u", "--user [STRING]", "iTunes Password") do |u|
    options[:user] = u
  end
  opts.on("-p", "--password [STRING]", "iTunes Password") do |p|
    options[:password] = p
  end
  opts.on("-a", "--appId [STRING]", "iTunes Password") do |a|
    options[:app] = a
  end
end.parse!

portal = PortalShip::Portal.new()
begin
  puts "Logging in..."
  app = portal.login(options[:user], options[:password], options[:app])
rescue Exception => ex
  puts "\n------------".colorize(:red)
  puts ex.message.colorize(:red)
  puts "------------\n\n".colorize(:red)
  exit(-1)
end

url = "http://34.253.160.173/metadata/#{options[:app]}.json"
uri = URI(url)
response = Net::HTTP.get(uri)
data = JSON.parse(response)

data.each do |child|
  lang = child[0]

  puts "Adding language #{lang}"

  d = app.details
  d.name[lang] = child[1]['name']
  d.subtitle[lang] = child[1]['subtitle']
  d.privacy_url[lang] = child[1]['privacyUrl']

  begin
    d.save!
  rescue Exception => ex
    puts "\n------------".colorize(:red)
    puts ex.message.colorize(:red)
    puts "------------\n\n".colorize(:red)
  end

  puts "Editing version for language #{lang}"

  v = app.edit_version
  v.create_languages(lang)
  v.description[lang] = child[1]['description']
  v.release_notes[lang] = child[1]['releaseNotes']
  v.keywords[lang] = child[1]['keywords']
  v.marketing_url[lang] = child[1]['marketingUrl']
  v.support_url[lang] = child[1]['supportUrl']
  v.promotional_text[lang] = child[1]['promotionalText']

  puts "Uploading screenshots for language #{lang}"
  screenshots = child[1]['screenshots']
  screenshots.each do |screenshot|
    url = screenshot['url']
    device = screenshot['device']
    order = screenshot['order']

    if url =~ /^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$/ix
      temp = portal.save_to_tempfile(url)
      puts "Uploading '#{url}'...".colorize(:green)
      begin
        v.upload_screenshot!(temp.path, order, lang, device, false)
      rescue Exception => ex
        puts "\n------------".colorize(:red)
        puts ex.message.colorize(:red)
        puts "------------\n\n".colorize(:red)
      ensure
        File.delete(temp.path)
      end
    else
      puts "\n------------".colorize(:blue)
      puts "url - #{url} not valid, screenshot not uploaded".colorize(:blue)
      puts "------------\n\n".colorize(:blue)
    end
  end

  begin
    v.save!
  rescue Exception => ex
    puts "\n------------".colorize(:red)
    puts ex.message.colorize(:red)
    puts "------------\n\n".colorize(:red)
  end

end

puts "Updated succesfully".colorize(:green)