require ‘cucumber/rake/task’

BROWSERS = JSON.load(File.open(‘browsers.json’))

desc ‘Run all cross browser tests in parallel (with ENV parallel limit)’ task :crossbrowsify => [:environment] do

parallel_limit = ENV["nodes"] || 2
parallel_limit = parallel_limit.to_i

sliced = BROWSERS.keys.each_slice(parallel_limit).to_a
browser_groups = sliced.first.zip(*sliced[1..-1])

browser_groups.each_with_index do |browser_group, group_index|
  browser_group.compact.each do |browser_name|
    if ENV['CIRCLE_NODE_INDEX'].to_i == group_index
      puts "Cross browser testing against #{browser_name}."

      Rake::Task["crossbrowsify:#{browser_name}"].execute
    end
  end
end

end

namespace :crossbrowsify do

desc "Downloading browserstack binary" 
task :setup do 
  download_browserstack unless File.exists? 'BrowserStackLocal' 
end 

desc "Open a tunnel for browserstack to access"  
task :run_local => [:setup] do 
  unless File.exists? 'browserstack_tunnel_map.json' 
    raise 'Missing browserstack_tunnel_map.json file! [{ name: "hostname", port: port_number}, ...]'
  end 

  hosts = JSON.load(File.open('browserstack_tunnel_map.json')).inject('') do |params, host|
    params += host['name'] + ',' + host['port'].to_s + ',0,'
  end

  identifier = ENV['CI'] ? "-localIdentifier #{ENV['CIRCLE_PROJECT_REPONAME']}-node-#{ENV['CIRCLE_NODE_INDEX']}" : ''

  puts 'Starting a local tunnel to Browserstack...'
  tunnel = Thread.new do 
    puts `./BrowserStackLocal #{identifier} -force -skipCheck $BS_AUTHKEY #{hosts}`
  end
  puts 'Started!'
  tunnel.join 
end 

BROWSERS.each_pair do |browser_name, browser|
  mobile = browser["mobile"] || false

  Cucumber::Rake::Task.new("#{browser_name}_run".to_sym) do |task|
    unless mobile
      task.cucumber_opts = ["--tags @cross_browser --tags ~@mobile"]
    else
      task.cucumber_opts = ["--tags @cross_browser --tags ~@not_mobile"]
    end

    task.cucumber_opts <<  '-r features'
  end

  desc "Run cucumber against #{browser['human']}"
  task browser_name do
    ENV['BROWSER_TASK_NAME'] = browser_name

    Rake::Task["crossbrowsify:#{browser_name}_run"].execute
  end
end

end

def download_browserstack

if `uname` =~ /darwin/i  
  url = "https://www.browserstack.com/browserstack-local/BrowserStackLocal-darwin-x64.zip" 
else 
  url = "https://www.browserstack.com/browserstack-local/BrowserStackLocal-linux-x64.zip " 
end 
`curl #{url} > browserstack.zip` 
`unzip browserstack.zip` 
File.delete('browserstack.zip')

end