require "rake-pipeline-web-filters"
require "json"
require "uglifier"

class EmberProductionFilter < Rake::Pipeline::Filter
  def generate_output(inputs, output)
    inputs.each do |input|
      result = File.read(input.fullpath)
      result.gsub!(%r{^(\s)+ember_(assert|deprecate|warn)\((.*)\).*$}, "")
      output.write result
    end
  end
end

class EmberLicenseFilter < Rake::Pipeline::Filter
  def generate_output(inputs, output)
    license = File.read("generators/license.js")
    inputs.each do |input|
      file = File.read(input.fullpath)
      output.write "#{license}\n\n#{file}"
    end
  end
end

class JSHintRC < Rake::Pipeline::Filter
  def generate_output(inputs, output)
    jshintrc = File.read(".jshintrc")
    inputs.each do |input|
      file = File.read(input.fullpath)
      output.write "var JSHINTRC = #{jshintrc};\n\n#{file}"
    end
  end
end

distros = {
  :runtime => %w(ember-metal ember-runtime),
  :full    => %w(handlebars ember-metal ember-runtime ember-views ember-states metamorph ember-handlebars)
}

output "dist"

input "packages" do
  output "tests"

  match "*/tests/**/*.js" do
    minispade :rewrite_requires => true, :string => true, :module_id_generator => proc { |input|
      id = input.path.dup
      id.sub!(/\.js$/, '')
      id.sub!(/\/main$/, '')
      id.sub!('/tests', '/~tests')
      id
    }

    concat "ember-tests.js"
  end

  match "ember-tests.js" do
    filter JSHintRC
  end
end

input "packages" do
  match "*/lib/**/*.js" do
    minispade :rewrite_requires => true, :string => true, :module_id_generator => proc { |input|
      id = input.path.dup
      id.sub!('/lib/', '/')
      id.sub!(/\.js$/, '')
      id.sub!(/\/main$/, '')
      id
    }

    concat "ember-spade.js"
  end
end

input "packages" do
  match "*/lib/**/main.js" do
    neuter(
      :additional_dependencies => proc { |input|
        Dir.glob(File.join(File.dirname(input.fullpath),'**','*.js'))
      },
      :path_transform => proc { |path, input|
        package, path = path.split('/', 2)
        current_package = input.path.split('/', 2)[0]
        current_package == package && path ? File.join(package, "lib", "#{path}.js") : nil
      },
      :closure_wrap => true
    ) do |filename|
      File.join("modules/", filename.gsub('/lib/main.js', '.js'))
    end
  end
end

distros.each do |name, modules|
  name = name == :full ? "ember" : "ember-#{name}"

  input "dist/modules" do
    module_paths = modules.map{|m| "#{m}.js" }
    match "{#{module_paths.join(',')}}" do
      concat(module_paths){ ["#{name}.js", "#{name}.prod.js"] }
    end

    # Add debug to the main distro
    match "{#{name}.js,ember-debug.js}" do
      concat ["ember-debug.js"], "#{name}.js"
    end

    # Strip dev code
    match "#{name}.prod.js" do
      filter(EmberProductionFilter) { ["#{name}.prod.js", "#{name}.min.js"] }
    end

    # Minify
    match "#{name}.min.js" do
      uglify{ "#{name}.min.js" }
      filter EmberLicenseFilter
    end
  end
end

# vim: filetype=ruby
