require('rubygems')
require('json')
require('yaml')
require('open-uri')

desc "download babel-browser"
task :fetch_remotes do
  IO.copy_stream(
    open('https://unpkg.com/babel-standalone@6.15.0/babel.min.js'),
    'js/babel.min.js'
  )
end

desc "generate js from jsx"
task :js do
  system "../node_modules/.bin/babel _js --out-dir=js"
end

desc "watch js"
task :watch do
  Process.spawn "../node_modules/.bin/babel _js --out-dir=js --watch"
  Process.waitall
end

desc "update version to match ../package.json"
task :update_version do
  react_version = JSON.parse(File.read('../package.json'))['version']
  site_config = YAML.load_file('_config.yml')
  if site_config['react_version'] != react_version
    site_config['react_version'] = react_version
    File.open('_config.yml', 'w+') { |f| f.write(site_config.to_yaml) }
  end
end

desc "update SRI hashes"
task :update_hashes do
  map = {
    'react.js' => 'dev',
    'react.min.js' => 'prod',
    'react-with-addons.js' => 'addons_dev',
    'react-with-addons.min.js' => 'addons_prod',
    'react-dom.js' => 'dom_dev',
    'react-dom.min.js' => 'dom_prod',
    'react-dom-server.js' => 'dom_server_dev',
    'react-dom-server.min.js' => 'dom_server_prod'
  }
  site_config = YAML.load_file('_config.yml')
  map.each do |file, key|
    site_config['react_hashes'][key] = `openssl dgst -sha384 -binary ../../react-bower/#{file} | openssl base64 -A`
  end
  File.open('_config.yml', 'w+') { |f| f.write(site_config.to_yaml) }
end

desc "update acknowledgements list"
task :update_acknowledgements do
  authors = File.readlines('../AUTHORS').map {|author| author.gsub(/ <.*\n/,'')}
  # split into cols here because nobody knows how to use liquid
  # need to to_f because ruby will keep slice_size as int and round on its own
  slice_size = (authors.size / 3.to_f).ceil
  cols = authors.each_slice(slice_size).to_a
  File.open('_data/acknowledgements.yml', 'w+') { |f| f.write(cols.to_yaml) }
end

desc "copy error codes to docs"
task :copy_error_codes do
  codes_json = File.read('../scripts/error-codes/codes.json')
  codes_js = "var errorMap = #{codes_json.chomp};\n"
  File.write('js/errorMap.js', codes_js)
end

desc "build into ../../react-gh-pages"
task :release => [:update_version, :js, :fetch_remotes, :copy_error_codes] do
  system "jekyll build -d ../../react-gh-pages"
end

task :default => [:js]