require “fileutils”

namespace :assets do

def ruby_rake_task(task, fork = true)
  env    = ENV['RAILS_ENV'] || 'production'
  groups = ENV['RAILS_GROUPS'] || 'assets'
  args   = [$0, task,"RAILS_ENV=#{env}","RAILS_GROUPS=#{groups}"]
  args << "--trace" if Rake.application.options.trace
  if $0 =~ /rake\.bat\Z/
    Kernel.exec $0, *args
  else  
    fork ? ruby(*args) : Kernel.exec(FileUtils::RUBY, *args)
  end    
end

# We are currently running with no explicit bundler group
# and/or no explicit environment - we have to reinvoke rake to
# execute this task.
def invoke_or_reboot_rake_task(task)
  if ENV['RAILS_GROUPS'].to_s.empty? || ENV['RAILS_ENV'].to_s.empty?
    ruby_rake_task task
  else
    Rake::Task[task].invoke
  end
end

desc "Compile all the assets named in config.assets.precompile"
task :precompile do
  invoke_or_reboot_rake_task "assets:precompile:all"
end

namespace :precompile do
  def internal_precompile(digest=nil)
    unless Rails.application.config.assets.enabled
      warn "Cannot precompile assets if sprockets is disabled. Please set config.assets.enabled to true"
      exit
    end

    # Ensure that action view is loaded and the appropriate
    # sprockets hooks get executed
    _ = ActionView::Base

    config = Rails.application.config
    config.assets.compile = true
    config.assets.digest  = digest unless digest.nil?
    config.assets.digests = {}

    env      = Rails.application.assets
    target   = File.join(Rails.public_path, config.assets.prefix)
    compiler = Sprockets::StaticCompiler.new(env,
                                             target,
                                             config.assets.precompile,
                                             :manifest_path => config.assets.manifest,
                                             :digest => config.assets.digest,
                                             :manifest => digest.nil?)
    compiler.compile
  end

  task :all do
    Rake::Task["assets:precompile:primary"].invoke
    # We need to reinvoke in order to run the secondary digestless
    # asset compilation run - a fresh Sprockets environment is
    # required in order to compile digestless assets as the
    # environment has already cached the assets on the primary
    # run.
    ruby_rake_task("assets:precompile:nondigest", false) if Rails.application.config.assets.digest
  end

  task :primary => ["assets:environment", "tmp:cache:clear"] do
    internal_precompile
  end

  task :nondigest => ["assets:environment", "tmp:cache:clear"] do
    internal_precompile(false)
  end
end

desc "Remove compiled assets"
task :clean do
  invoke_or_reboot_rake_task "assets:clean:all"
end

namespace :clean do
  task :all => ["assets:environment", "tmp:cache:clear"] do
    config = Rails.application.config
    public_asset_path = File.join(Rails.public_path, config.assets.prefix)
    rm_rf public_asset_path, :secure => true
  end
end

task :environment do
  if Rails.application.config.assets.initialize_on_precompile
    Rake::Task["environment"].invoke
  else
    Rails.application.initialize!(:assets)
    Sprockets::Bootstrap.new(Rails.application).run
  end
end

end