$LOAD_PATH.unshift '/srv/whimsy/lib'

# Remove world writable directories that Travis may insert into the PATH,
# as these cause security errors during testing
ENV['PATH'] = ENV['PATH'].split(File::PATH_SEPARATOR).
  reject {|path| File.world_writable? path}.join(File::PATH_SEPARATOR)

require 'whimsy/asf/config'

require 'rspec/core/rake_task'
RSpec::Core::RakeTask.new(:spec)
task :default => :spec
task :spec => 'test:setup'
task :test => :spec

# setup authentication
task :auth do
  require 'etc'
  require 'io/console'
  require 'base64'

  user = ENV['USER'] || ETC.getlogin
  STDOUT.write "Enter password for #{user}: "
  password = STDIN.noecho(&:gets).chomp
  ENV['HTTP_AUTHORIZATION'] = "Basic #{Base64.encode64("#{user}:#{password}")}"
  STDOUT.puts
end

task :server => [:bundle, :listen] do
  ENV['DOCUMENT_ROOT'] = File.expand_path('../..', Dir.pwd)
  ENV['RACK_ENV']='development'
  ENV['OBJC_DISABLE_INITIALIZE_FORK_SAFETY']='YES' if RUBY_PLATFORM =~ /darwin/
  at_exit {sleep 0.5}
  sh 'bundle exec passenger start'
end

namespace :server do
  task :test => :work do
    ENV['DOCUMENT_ROOT'] = File.expand_path('../..', Dir.pwd)
    ENV['RACK_ENV']='test'
    ENV['USER']='test'
    require 'bundler'
    Bundler.require(:default, :test)
    require 'wunderbar/listen'
  end
end

task "touch" do
  sh 'touch', File.expand_path('../tmp/restart.txt', __FILE__)
end

file 'package-lock.json' => 'package.json' do
  sh 'npm install'
  sh 'touch package-lock.json'
end

file 'test/work' do
  mkdir_p 'test/work'
end

file 'test/work/repository' => 'test/work' do
  unless File.exist? 'test/work/repository/format'
    system 'svnadmin create test/work/repository'
  end
end

file 'test/work/board' => 'test/work/repository' do
  Dir.chdir('test/work') do
    rm_rf 'board' if File.exist? 'board'
    system "svn co file:///#{Dir.pwd}/repository board"
    cp Dir['../data/*.txt'], 'board'
    Dir.chdir('board') {system 'svn add *.txt; svn commit -m "initial commit"'}
  end
end

testfiles = %w(board_minutes_2015_01_21 board_minutes_2015_02_18 test)
testfiles.each do |testfile|
  file "test/work/data/#{testfile}.yml" do
    mkdir_p 'test/work/data' unless File.exist? 'test/work/data'
    cp "test/#{testfile}.yml", "test/work/data/#{testfile}.yml"
  end
end

task :reset do
  testfiles.each do |testfile|
    if File.exist? "test/work/data/#{testfile}.yml"
      if 
        IO.read("test/#{testfile}.yml") != 
        IO.read("test/work/data/#{testfile}.yml")
      then
        rm "test/work/data/#{testfile}.yml"
      end
    end
  end

  if
    Dir['test/work/board/*'].any? do |file|
      base = "test/data/#{File.basename file}"
      not File.exist?(base) or IO.read(base) != IO.read(file)
    end
  then
    rm_rf 'test/work/board'
  end

  unless Dir.exist? 'test/work/board'
    rm_rf 'test/work/repository'
  end
end

task :work => ['test/work/board', 
  *testfiles.map {|testfile| "test/work/data/#{testfile}.yml"}]

namespace :test do
  task :setup => [:reset, :work, 'package-lock.json']
  task :server => 'server:test'

  task :stress => :setup do
    ruby 'test/stresstest.rb'
  end
end

task :clobber do
  rm_rf 'test/work'
end

task :update do
  # update agenda application
  Dir.chdir File.dirname(__FILE__) do
    puts "#{File.dirname(File.realpath(__FILE__))}:"
    system 'git pull'
  end
  
  # update libs
  if File.exist? "#{ENV['HOME']}/.whimsy"
    libs = YAML.load_file("#{ENV['HOME']}/.whimsy")[:lib] || []
    libs.each do |lib|
      puts "\n#{lib}:"
      if not File.exist? lib
        puts 'not found'
        next
      end

      # determine repository type
      repository = :none
      parent = File.realpath(lib)
      while repository == :none and parent != '/'
        if File.exist? File.join(parent, '.svn')
          repository = :svn
        elsif File.exist? File.join(parent, '.git')
          repository = :git
        else
          parent = File.dirname(parent)
        end
      end

      # update repository
      Dir.chdir lib do
        system 'svn up' if repository == :svn
        system 'git pull' if repository == :git
      end
    end
  end

  # update gems
  puts "\nbundle update:"
  system 'bundle update'
end

namespace :svn do
  task :update do
    ASF::Config.get(:svn).each do |svn|
      if Dir.exist? svn
        puts "\n#{svn}:"
        Dir.chdir(svn) {system 'svn up'}
      end
    end
  end
end

task :bundle => 'Gemfile.lock' do
  require 'bundler'
  Bundler.require(:default, :development)
end

# restart server when files update
task :listen => :bundle do
  dirs = [
    File.expand_path('..', File.realpath(__FILE__)),
    File.expand_path('../../../../lib', File.realpath(__FILE__))
  ]

  listener = Listen.to(*dirs) do |modified, added, removed|
    puts "detected update: #{(modified + added + removed).join(', ')}"
    FileUtils.touch "#{dirs.first}/tmp/restart.txt"
  end

  listener.ignore /~$/
  listener.ignore /^\..*\.sw\w$/
  listener.ignore /passenger.\d+\.(log|pid(\.lock)?)$/

  listener.start
end

# cleanup
require 'rake/clean'
CLEAN.include 'passenger.3000.*', 'test/work', 'public/assets'
CLOBBER.include 'node_modules', 'package-lock.json'
