require "bundler/gem_tasks"

desc "Set up and run tests"
task :default => [:test]

desc "Run tests"
task :test do
  sh "bundle exec rspec spec"
end


desc "Autobuild JS/SCSS"
task :watch do
  require "bundler/setup"
  require "fssm"

  monitor = FSSM::Monitor.new

  monitor.path "coffee", "**/*.coffee" do
    compile_block = -> basename, filename do
      puts "Compiling coffee to minified js..."
      coffee_file = "coffee/#{filename}"
      puts "\t#{coffee_file}"
      Rake::Task["js:compile_file"].tap(&:reenable).invoke(coffee_file)
      Rake::Task["js:minify_file"].tap(&:reenable).invoke(coffee_file)
    end

    update &compile_block
    delete &compile_block
    create &compile_block
  end

  monitor.run
end


namespace :js do
  desc "Compiles CS & minifies JS"
  task :compile do
    puts "Compiling coffee to minified js..."
    Rake::Task["js:compile_cs"].tap(&:reenable).invoke()
    Rake::Task["js:minify_js"].tap(&:reenable).invoke()
    puts "\t\t->done\n\n"
  end

  task :compile_cs, :filename do |t, args|
    require "coffee-script"

    coffee_script = ""

    %w{bloomfilter bitarray zlib}.each do |library|
      filename = "coffee/#{library}.coffee"
      puts "\t#{filename}"
      coffee_script += File.read(filename) + "\n"
    end

    js_file = "js/bloomfilter.js"
    directory_name = File.dirname js_file
    FileUtils.mkdir_p(directory_name) unless File.exists? directory_name
    puts "\t\t->#{js_file}"
    File.open(js_file, "w+") do |f|
      f.print CoffeeScript.compile(coffee_script, no_wrap: true)
    end
  end

  task :minify_js, :filename do |t, args|
    require "yui/compressor"
    filename = args[:filename]
    compressor = YUI::JavaScriptCompressor.new

    js_file = "js/bloomfilter.js"
    min_file = "js/bloomfilter.min.js"

    puts "\t\t->#{min_file}"
    directory_name = File.dirname min_file
    FileUtils.mkdir_p(directory_name) unless File.exists? directory_name
    File.open(min_file, "w+") do |f|
      f.print compressor.compress(File.read(js_file))
    end
    File.delete js_file
  end

end