require 'bundler'
require 'photish/version'

desc "Build all"
task :build => ['build:gem',
                'build:linux:x86',
                'build:linux:x86_64',
                'build:osx',
                'build:win32']

namespace :build do
  desc "Clean up install files"
  task :clean do
    sh "rm -rf #{TaskConfig::BINARY_DIR}/*tar"
    sh "rm -rf #{TaskConfig::BINARY_DIR}/*zip"
    sh "rm -rf #{TaskConfig::BINARY_DIR}/*gem"
  end

  desc "Create GEM file"
  task :gem do
    sh "mkdir -p #{TaskConfig::BINARY_DIR}"
    sh "gem build photish.gemspec"
    sh "mv photish*.gem #{TaskConfig::BINARY_DIR}"
  end

  namespace :linux do
    desc "Package your app for Linux x86"
    task :x86 => [:bundle_install, "#{TaskConfig::RELEASES_DIR}/traveling-ruby-#{TaskConfig::TRAVELING_RUBY_VERSION}-linux-x86.tar.gz"] do
      create_package("linux-x86", :unix)
    end

    desc "Package your app for Linux x86_64"
    task :x86_64 => [:bundle_install, "#{TaskConfig::RELEASES_DIR}/traveling-ruby-#{TaskConfig::TRAVELING_RUBY_VERSION}-linux-x86_64.tar.gz"] do
      create_package("linux-x86_64", :unix)
    end
  end

  desc "Package your app for OS X"
  task :osx => [:bundle_install, "#{TaskConfig::RELEASES_DIR}/traveling-ruby-#{TaskConfig::TRAVELING_RUBY_VERSION}-osx.tar.gz"] do
    create_package("osx", :unix)
  end

  desc "Package your app for Windows x86"
  task :win32 => [:bundle_install, "#{TaskConfig::RELEASES_DIR}/traveling-ruby-#{TaskConfig::TRAVELING_RUBY_VERSION}-win32.tar.gz"] do
    create_package("win32", :windows)
  end

  desc "Install gems to local directory"
  task :bundle_install do
    if RUBY_VERSION !~ /^#{TaskConfig::EXPECTED_RUBY_VERSION.sub('.', '\.')}/
      abort "You can only 'bundle install' using Ruby 2.1, because that's what Traveling Ruby uses."
    end
    sh "rm -rf #{TaskConfig::SCRATCH_DIR}"
    sh "mkdir -p #{TaskConfig::SCRATCH_DIR}"
    sh "cp Gemfile Gemfile.lock #{TaskConfig::SCRATCH_DIR}"
    new_contents = File.read("#{TaskConfig::SCRATCH_DIR}/Gemfile")
                       .gsub(/^gemspec.*$/, "gemspec path: '#{TaskConfig::WORKING_DIR || '../../../'}'")
    File.open("#{TaskConfig::SCRATCH_DIR}/Gemfile", "w") {|file| file.puts(new_contents) }
    Bundler.with_clean_env do
      sh "cd #{TaskConfig::SCRATCH_DIR} && env BUNDLE_IGNORE_CONFIG=1 bundle install --path ../vendor --without development"
    end
    sh "rm -f #{TaskConfig::CACHE_DIR}/vendor/*/*/cache/*"

    sh "rm -rf #{TaskConfig::CACHE_DIR}/vendor/ruby/*/gems/*/test"
    sh "rm -rf #{TaskConfig::CACHE_DIR}/vendor/ruby/*/gems/*/tests"
    sh "rm -rf #{TaskConfig::CACHE_DIR}/vendor/ruby/*/gems/*/spec"
    sh "rm -rf #{TaskConfig::CACHE_DIR}/vendor/ruby/*/gems/*/features"
    sh "rm -rf #{TaskConfig::CACHE_DIR}/vendor/ruby/*/gems/*/benchmark"

    sh "rm -f #{TaskConfig::CACHE_DIR}/vendor/ruby/*/rdoc*"
    sh "rm -f #{TaskConfig::CACHE_DIR}/vendor/ruby/*/gems/*/ext/Makefile"
    sh "rm -f #{TaskConfig::CACHE_DIR}/vendor/ruby/*/gems/*/ext/*/Makefile"
    sh "rm -f #{TaskConfig::CACHE_DIR}/vendor/ruby/*/gems/*/ext/*/tmp"
    sh "rm -f #{TaskConfig::CACHE_DIR}/vendor/ruby/*/gems/*/ext/*/tmp"
    sh "find #{TaskConfig::CACHE_DIR}/vendor/ruby -name '*.c' | xargs rm -f"
    sh "find #{TaskConfig::CACHE_DIR}/vendor/ruby -name '*.cpp' | xargs rm -f"
    sh "find #{TaskConfig::CACHE_DIR}/vendor/ruby -name '*.h' | xargs rm -f"
    sh "find #{TaskConfig::CACHE_DIR}/vendor/ruby -name '*.rl' | xargs rm -f"
    sh "find #{TaskConfig::CACHE_DIR}/vendor/ruby -name 'extconf.rb' | xargs rm -f"
    sh "find #{TaskConfig::CACHE_DIR}/vendor/ruby/*/gems -name '*.o' | xargs rm -f"
    sh "find #{TaskConfig::CACHE_DIR}/vendor/ruby/*/gems -name '*.so' | xargs rm -f"
    sh "find #{TaskConfig::CACHE_DIR}/vendor/ruby/*/gems -name '*.bundle' | xargs rm -f"
    sh "find #{TaskConfig::CACHE_DIR}/vendor/ruby -name '*.java' | xargs rm -f"
    sh "find #{TaskConfig::CACHE_DIR}/vendor/ruby -name '*.class' | xargs rm -f"
  end
end

file "#{TaskConfig::RELEASES_DIR}/traveling-ruby-#{TaskConfig::TRAVELING_RUBY_VERSION}-win32.tar.gz" do
  download_runtime("win32")
end

file "#{TaskConfig::RELEASES_DIR}/traveling-ruby-#{TaskConfig::TRAVELING_RUBY_VERSION}-linux-x86.tar.gz" do
  download_runtime("linux-x86")
end

file "#{TaskConfig::RELEASES_DIR}/traveling-ruby-#{TaskConfig::TRAVELING_RUBY_VERSION}-linux-x86_64.tar.gz" do
  download_runtime("linux-x86_64")
end

file "#{TaskConfig::RELEASES_DIR}/traveling-ruby-#{TaskConfig::TRAVELING_RUBY_VERSION}-osx.tar.gz" do
  download_runtime("osx")
end

def package_dir_of(target)
  "#{Photish::NAME}-#{Photish::VERSION}-#{target}"
end

def create_package(target, os_type)
  package_dir = package_dir_of(target)
  sh "rm -rf #{package_dir}"
  sh "mkdir -p #{package_dir}/lib/app"
  sh "cp -rf lib #{package_dir}/lib/app/"
  sh "cp -rf exe #{package_dir}/lib/app/"
  sh "mkdir #{package_dir}/lib/ruby"
  sh "tar -xzf #{TaskConfig::RELEASES_DIR}/traveling-ruby-#{TaskConfig::TRAVELING_RUBY_VERSION}-#{target}.tar.gz -C #{package_dir}/lib/ruby"
  if os_type == :unix
    sh "cp packaging/wrapper.sh #{package_dir}/photish"
    sh "chmod +x #{package_dir}/photish"
  else
    sh "cp packaging/wrapper.bat #{package_dir}/photish.bat"
  end
  sh "cp -pR #{TaskConfig::CACHE_DIR}/vendor #{package_dir}/lib/"

  sh "cp photish.gemspec #{package_dir}/lib/app"
  new_contents = File.read("#{package_dir}/lib/app/photish.gemspec")
                     .gsub(/spec\.files.*$/, "spec.files = ''")
                     .gsub(/^.*add_development_dependency.*$/, '')
  File.open("#{package_dir}/lib/app/photish.gemspec", "w") {|file| file.puts(new_contents) }

  new_contents = File.read("#{TaskConfig::SCRATCH_DIR}/Gemfile")
                     .gsub(/^gemspec.*$/, "gemspec path: '../app'")
  File.open("#{TaskConfig::SCRATCH_DIR}/Gemfile", "w") {|file| file.puts(new_contents) }
  sh "cp #{TaskConfig::SCRATCH_DIR}/Gemfile #{TaskConfig::SCRATCH_DIR}/Gemfile.lock #{package_dir}/lib/vendor/"
  sh "mkdir #{package_dir}/lib/vendor/.bundle"
  sh "cp #{TaskConfig::PACKAGING_DIR}/bundler-config #{package_dir}/lib/vendor/.bundle/config"
  if !ENV['DIR_ONLY']
    sh "mkdir -p #{TaskConfig::BINARY_DIR}"
    if os_type == :unix
      sh "tar -czf #{TaskConfig::BINARY_DIR}/#{package_dir}.tar.gz #{package_dir}"
    else
      sh "zip -9r #{TaskConfig::BINARY_DIR}/#{package_dir}.zip #{package_dir}"
    end
    sh "rm -rf #{package_dir}"
  end
end

def download_runtime(target)
  sh "mkdir -p #{TaskConfig::RELEASES_DIR}"
  sh "cd #{TaskConfig::RELEASES_DIR} && curl -L -O --fail " +
     "http://d6r77u77i8pq3.cloudfront.net/releases/traveling-ruby-#{TaskConfig::TRAVELING_RUBY_VERSION}-#{target}.tar.gz"
end

def update_after_install_script(package_dir)
  new_contents = File.read("#{TaskConfig::PACKAGING_DIR}/after-install.sh").gsub(/PACKAGE_PLACEHOLDER/, package_dir)
  sh "mkdir -p #{TaskConfig::CACHE_DIR}"
  File.open("#{TaskConfig::CACHE_DIR}/after-install.sh", "w") {|file| file.puts(new_contents) }
  "#{TaskConfig::CACHE_DIR}/after-install.sh"
end
