#!/usr/bin/env ruby
$:.unshift(File.dirname(__FILE__) + '/../lib')

require 'fake_dynamo'
require 'optparse'

options = { :port => 4567, :compact => false, :db => '/usr/local/var/fake_dynamo/db.fdb' }
OptionParser.new do |opts|
  opts.banner = "Usage: fake_dynamo [options]"

  opts.on("-p", "--port PORT", "Default: #{options[:port]}") do |v|
    options[:port] = v
  end

  opts.on("-d", "--db PATH", "Default: #{options[:db]}") do |v|
    options[:db] = v
  end

  opts.on("-c", "--compact", "Default: #{options[:compact]}") do |v|
    options[:compact] = v
  end

  opts.on "-P", "--pid PIDFILE", "Where to write the pid" do |pid|
    options[:pid] = pid
  end

  opts.on "-D", "--[no-]daemonize", "Detaches the process" do |daemonize|
    options[:daemonize] = daemonize
  end

end.parse!

if options[:daemonize]
  Process.daemon(true, true)
end

if (pid = options[:pid])
  if File.exist?(pid)
    existing_pid = File.open(pid, 'r').read.chomp.to_i
    running = Process.getpgid(existing_pid) rescue false
    if running
      warn "Error, Process #{existing_pid} already running"
      exit 1
    else
      warn "Cleaning up stale pid at #{pid}"
    end
  end
  File.open(pid, 'w') { |f| f.write(Process.pid) }
end

FakeDynamo::Storage.db_path = options[:db]

if options[:compact]
  FakeDynamo::Storage.instance.load_aof
  FakeDynamo::Storage.instance.compact!
end

FakeDynamo::Storage.instance.load_aof
FakeDynamo::Server.run!(:port => options[:port])

at_exit {
  FakeDynamo::Storage.instance.shutdown
}
