require 'bundler'
Bundler::GemHelper.install_tasks

def sources
  dependencies = JSON.parse(File.read('./src/SourcesList.json')).collect {|f| "./src/core/#{f}"}
  dependencies + Dir.glob('./src/core/*.js').reject {|f| dependencies.include?(f)}.sort
end

def html_sources
  ["./src/html/TrivialReporter.js"]
end

def version_hash
  @version ||= JSON.parse(File.new("./src/core/version.json").read)
end

def substitute_version(filename)
  contents = File.read(filename)
  contents = contents.gsub(/##JASMINE_VERSION##/, (jasmine_version))
    contents = contents.gsub(/[^\n]*REMOVE_THIS_LINE_FROM_BUILD[^\n]*/, '')
  File.open(filename, 'w') { |f| f.write(contents) }
end

task :default => :spec

desc "Run spec suite: Browser, Node, JSHint"
task :spec => ["jasmine:build", "spec:node", "spec:browser"]

namespace :spec do
  desc 'Run specs in Node.js'
  task :node => "jasmine:require_node" do
    system("node spec/node_suite.js")
  end

  desc "Run specs in the default browser (MacOS only)"
  task :browser do
    system("open spec/runner.html")
  end
end

namespace :jasmine do

  task :require_node do
    raise "Node.js is required" if `which node` == ''
  end


  desc 'Prepares for distribution'
  task :dist => ['jasmine:build',
    'jasmine:doc',
    'jasmine:build_pages',
    'jasmine:build_example_project',
    'jasmine:fill_index_downloads']

  desc 'Check jasmine sources for coding problems'
  task :lint => "jasmine:require_node" do
    puts "Running JSHint via Node.js"
    system("node jshint/run.js") || exit(1)
  end

  desc "Alias to JSHint"
  task :hint => :lint

  desc 'Builds lib/jasmine from source'
  task :build => :lint do
    puts 'Building Jasmine from source'

    version = Jasmine::Core::VERSION_HASH

    File.open("./lib/jasmine-core/jasmine.js", 'w') do |jasmine|
      sources.each do |source_filename|
        jasmine.puts(File.read(source_filename))
      end

      jasmine.puts %{
jasmine.version_= {
  "major": #{version['major'].to_json},
  "minor": #{version['minor'].to_json},
  "build": #{version['build'].to_json},
  "revision": #{Time.now.to_i},
  "release_candidate": #{version['release_candidate'].to_json}
};
      }
    end

    File.open("./lib/jasmine-core/jasmine-html.js", 'w') do |jasmine_html|
      html_sources.each do |source_filename|
        jasmine_html.puts(File.read(source_filename))
      end
    end

    FileUtils.cp("./src/html/jasmine.css", "lib/jasmine-core/jasmine.css")
  end

  downloads_file = 'pages/download.html'
  task :need_pages_submodule do
    unless File.exist?(downloads_file)
      raise "Jasmine pages submodule isn't present.  Run git submodule update --init"
    end
  end

  desc "Build the Github pages HTML"
  task :build_pages => :need_pages_submodule do
    Dir.chdir("pages") do
      FileUtils.rm_r('pages_output') if File.exist?('pages_output')
      Dir.chdir('pages_source') do
        system("frank export ../pages_output")
      end
      puts "\nCopying Frank output to the root of the gh-pages branch\n\n"
      system("cp -r pages_output/* .")
    end
  end

  desc "Build jasmine documentation"
  task :doc => :need_pages_submodule do
    puts 'Creating Jasmine Documentation'
    require 'rubygems'
    require 'jsdoc_helper'

    FileUtils.rm_r "pages/jsdoc", :force => true

    JsdocHelper::Rake::Task.new(:lambda_jsdoc) do |t|
      t[:files] = sources << html_sources
      t[:options] = "-a"
      t[:out] = "pages/jsdoc"
      # JsdocHelper bug: template must be relative to the JsdocHelper gem, ick
      t[:template] = File.join("../".*(100), Dir::getwd, "jsdoc-template")
    end
    Rake::Task[:lambda_jsdoc].invoke
  end

  desc "Build example project"
  task :build_example_project => :need_pages_submodule do
    require 'tmpdir'

    temp_dir = File.join(Dir.tmpdir, 'jasmine-standalone-project')
    puts "Building Example Project in #{temp_dir}"
    FileUtils.rm_r temp_dir if File.exist?(temp_dir)
    Dir.mkdir(temp_dir)

    root = File.expand_path(File.dirname(__FILE__))
    FileUtils.cp_r File.join(root, 'example/.'), File.join(temp_dir)
    substitute_version(File.join(temp_dir, "SpecRunner.html"))

    lib_dir = File.join(temp_dir, "lib", "jasmine-#{jasmine_version}")
    FileUtils.mkdir_p(lib_dir)
    {
      "lib/jasmine.js" => "jasmine.js",
      "lib/jasmine-html.js" => "jasmine-html.js",
      "src/html/jasmine.css" => "jasmine.css",
      "MIT.LICENSE"  => "MIT.LICENSE"
    }.each_pair do |src, dest|
      FileUtils.cp(File.join(root, src), File.join(lib_dir, dest))
    end

    dist_dir = File.join(root, 'pages/downloads')
    zip_file_name = File.join(dist_dir, "jasmine-standalone-#{jasmine_version}.zip")
    puts "Zipping Example Project and moving to #{zip_file_name}"
    FileUtils.mkdir(dist_dir) unless File.exist?(dist_dir)
    if File.exist?(zip_file_name)
      puts "WARNING!!! #{zip_file_name} already exists!"
      FileUtils.rm(zip_file_name)
    end
    exec "cd #{temp_dir} && zip -r #{zip_file_name} . -x .[a-zA-Z0-9]*"
  end

end

task :build => "jasmine:build"
