require 'bundler/gem_tasks'

require 'rubygems'
require 'bundler/setup'
require 'rake/testtask'

require File.dirname(__FILE__) + '/lib/fog/arubacloud'

task :default => :test

def name
  @name ||= Dir['*.gemspec'].first.split('.').first
end

GEM_NAME = "#{name}"

def version
  Fog::ArubaCloud::VERSION
end

def gem_file
  "#{name}-#{version}.gem"
end

def gemspec_file
  "#{name}.gemspec"
end

def replace_header(head, header_name)
  head.sub!(/(\.#{header_name}\s*= ').*'/) { "#{$1}#{send(header_name)}'"}
end

Rake::TestTask.new do |t|
  t.pattern = File.join('spec', '**', '*_spec.rb')
  t.libs << 'spec'
  t.verbose = true
end

namespace :test do
  mock = 'true' || ENV['FOG_MOCK']
  task :travis do
    ENV['COVERAGE'] = 'false' if RUBY_PLATFORM == 'java'
    sh("export FOG_MOCK=#{mock} && bundle exec rake")
  end
end

task :release => %w(release:prepare release:publish)

namespace :release do
  task :preflight do
    unless `git branch` =~ /^\* master$/
      puts 'You must be on the master branch to release!'
      exit!
    end
    if `git tag` =~ /^\* v#{version}$/
      puts "Tag v#{version} already exists!"
      exit!
    end
  end

  task :prepare => :preflight do
    Rake::Task[:build].invoke
    sh "gem install pkg/#{name}-#{version}.gem"
    Rake::Task[:git_mark_release].invoke
  end

  task :publish do
    Rake::Task[:git_push_release].invoke
    Rake::Task[:gem_push].invoke
  end
end

task :git_mark_release do
  sh "git commit --allow-empty -a -m 'Release #{version}'"
  sh "git tag v#{version}"
end

task :git_push_release do
  sh 'git push origin master'
  sh "git push origin v#{version}"
end

task :gem_push do
  sh "gem push pkg/#{name}-#{version}.gem"
end

desc "Build fog-#{version}.gem"
task :build => :gemspec do
  sh 'mkdir -p pkg'
  sh "gem build #{gemspec_file}"
  sh "mv #{gem_file} gemfiles"
end
task :gem => :build

desc "Updates the gemspec and runs 'validate'"
task :gemspec => :validate do
  spec = File.read(gemspec_file)

  replace_header(spec, :name)
  replace_header(spec, :version)
  replace_header(spec, :date)

  File.open(gemspec_file, 'w') { |io| io.write(spec) }
  puts "Updated #{gemspec_file}"
end

desc 'Run before pushing out the code'
task :validate do
  libfiles = Dir['lib/*'] - %W(lib/#{name}.rb lib/#{name} lib/tasks)
  unless libfiles.empty?
    puts "Directory `lib` should only contain a `#{name}.rb` file and `#{name}` dir."
    #exit!
  end
  unless Dir['VERSION*'].empty?
    puts 'A `VERSION` file at root level violates Gem best practices.'
    exit!
  end
end