require "rubygems"
require 'gorgon'
require 'gorgon/originator'
require 'gorgon/listener'
require 'gorgon/rsync_daemon'
require 'gorgon/worker_manager'
require 'gorgon/ping_service'
require 'gorgon/gem_service'
require 'gorgon/version'
require 'gorgon/listener_installer'
require 'gorgon/settings/initial_files_creator'

WELCOME_MSG = "Welcome to Gorgon #{Gorgon::VERSION}"

def start
  o = Originator.new
  o.originate
end

def listen
  l = Listener.new
  l.listen
end

def start_rsync_daemon
  puts "Starting rsync daemon..."
  exit 1 unless RsyncDaemon.start ARGV[1]
  puts "Rsync Daemon is running. Use 'gorgon stop_rsync' to kill it."
end

def stop_rsync_daemon
  puts "Stopping rsync daemon..."
  exit 1 unless RsyncDaemon.stop
  puts "Done"
end

def manage_workers
  config_path = ENV["GORGON_CONFIG_PATH"]

  manager = WorkerManager.build config_path
  manager.manage

  # For some reason I have to 'exit' here, otherwise WorkerManager process crashes
  exit
end

def ping_listeners
  PingService.new.ping_listeners
end

def run_gem command
  GemService.new.run command
end

def init framework
  Settings::InitialFilesCreator.run framework
end

def install_listener
  ListenerInstaller.install
end

def usage
  #print instructions on how to use gorgon
  puts "\tstart - remotely runs all tests specified in gorgon.json"
  puts "\tlisten - starts a listener process using the settings in gorgon_listener.json"
  puts "\tping - pings listeners and shows hosts and gorgon's version they are running"
  puts "\tinit [rails] - create initial files for current project"
  puts "\tinstall_listener - runs gorgon listener as a daemon process"
  puts "\tstart_rsync <directory> - start rsync daemon. Run this command in File Server"
  puts "\tstop_rsync - stop rsync daemon."
  puts "\tgem command [options...] - execute the gem command on every listener and shutdown listener. e.g. 'gorgon gem install --version 1.0.0'"
end

puts WELCOME_MSG

case ARGV[0]
when nil
  start
when "start"
  start
when "listen"
  listen
when "start_rsync"
  start_rsync_daemon
when "stop_rsync"
  stop_rsync_daemon
when "manage_workers"
  manage_workers
when "ping"
  ping_listeners
when "gem"
  ARGV.shift
  run_gem ARGV.join(' ')
when "help"
  usage
when "init"
  init ARGV[1]
when "install_listener"
  install_listener
else
  puts "Unknown command!"
  usage
  exit 1
end