#!/usr/bin/env ruby

FERRET_SERVER = File.expand_path(__FILE__)

require 'optparse'

$ferret_server_options = {
  'environment' => nil,
  'debug'       => nil,
  'root'        => nil
}

OptionParser.new do |optparser|
  optparser.banner = "Usage: #{FERRET_SERVER} [options] {start|stop|run}"

  optparser.on('-h', '--help', "This message") do
    puts optparser
    exit
  end
  
  optparser.on('-R', '--root=PATH', 'Set Rails.root to the given string') do |r|
    $ferret_server_options['root'] = r
  end

  optparser.on('-e', '--environment=NAME', 'Set Rails.env to the given string') do |e|
    $ferret_server_options['environment'] = e
  end

  optparser.on('--debug', 'Include full stack traces on exceptions') do
    $ferret_server_options['debug'] = true
  end

  $ferret_server_action = optparser.permute!(ARGV)
  (puts optparser; exit(1)) unless $ferret_server_action.size == 1

  $ferret_server_action = $ferret_server_action.first
  (puts optparser; exit(1)) unless %w(start stop run).include?($ferret_server_action)
end

################################################################################

def determine_rails_root
  possible_rails_roots = [
    $ferret_server_options['root'],
    (defined?(FERRET_SERVER) ? File.join(File.dirname(FERRET_SERVER), '..') : nil),
    File.join(File.dirname(__FILE__), *(['..']*4)),
    '.'
  ].compact
  # take the first dir where environment.rb can be found
  possible_rails_roots.find{ |dir| File.readable?(File.join(dir, 'config', 'application.rb')) }
end

begin
  ENV['FERRET_USE_LOCAL_INDEX'] = 'true'
  if env = $ferret_server_options['environment']
    ENV['RAILS_ENV'] = env
  end
  
  # determine RAILS_ROOT unless already set
  root = File.expand_path(determine_rails_root)
  
  begin
    require File.join(root, 'config', 'application')
  rescue
    puts "Error booting your rails app at #{root}: #{$!}\n#{$!.backtrace.join("\n")}"
    raise $!
  end
  
  puts "Rails.root: #{Rails.root}"
  puts "Rails.env: #{Rails.env}"

  require 'acts_as_ferret/server/server'
  ActsAsFerret::Server::Server.new.send($ferret_server_action)
rescue Exception => e
  $stderr.puts(e.message)
  $stderr.puts(e.backtrace.join("\n")) if $ferret_server_options['debug']
  exit(1)
end
