namespace :server do

def execute(command)
  puts "Executing: #{command}"
  `#{command}`
end

Inf.server.servers.each do |server|
  namespace server do

    desc "Start #{server} server"
    task :start do
      puts "Starting: #{server.to_s.green}"
      start_command = Inf.server.fetch(server).fetch :start
      if start_command.nil?
        raise "no start command configured for #{server}"
      else
        execute start_command
      end
    end

    desc "Stop #{server} server"
    task :stop do
      puts "Stopping: #{server.to_s.green}"
      stop_command = Inf.server.fetch(server).fetch :stop
      if stop_command.nil?
        raise "no stop command configured for #{server}"
      elsif stop_command == 'kill'
        Rake::Task["server:#{server}:kill"].reinvoke
      else
        execute stop_command
      end
    end

    desc "Restart #{server} server"
    task :restart do
      Rake::Task["server:#{server}:stop"].reinvoke
      Rake::Task["server:#{server}:start"].reinvoke
    end

    desc "Kill #{server} server"
    task :kill do
      pid_file = Inf.server.fetch(server).pid_file
      if File.exists? pid_file
        pid = File.read(pid_file).strip.to_i
        raise "could not parse #{server} pid from #{pid_file}" if pid == 0
        signal = Inf.server.fetch(server).fetch(:kill_signal) || 'QUIT'
        begin
          puts "Signal: #{signal}, PID: #{pid}"
          Process.kill signal, pid
        rescue Errno::ENOENT, Errno::ESRCH
        end
      end
    end

    desc "Tail #{server} server log file"
    task :tail do
      log_file = Inf.server.fetch(server).log_file
      puts "Watching: #{log_file.green}"
      begin
        IO.popen "tail -n 0 -f #{log_file}" do |file|
          while line = file.gets.to_s.strip do
            puts line unless line.empty?
          end
        end
      rescue Interrupt
      end
    end

  end
end

end