#!/usr/bin/env ruby
# The command line Restfully client

$LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'

require 'restfully'
require 'optparse'
require 'logger'
require 'pp'
require 'yaml'


logger = Logger.new(STDOUT)
logger.level = Logger::WARN
@options = {:logger => logger}
option_parser = OptionParser.new do |opts|
  opts.banner = "Usage: restfully base_uri [root_path] [options]"

  opts.on("-u=", "--username=", "Sets the username") do |u|
    @options[:username] = u
  end
  opts.on("-p=", "--password=", "Sets the user password") do |p|
    @options[:password] = p
  end
  opts.on("-c=", "--config=", "Sets the various options based on a custom YAML configuration file") do |v|
    @options[:configuration_file] = v
  end
  opts.on("--log=", "Outputs log messages to the given file. Defaults to stdout") do |v|
    original_logger_level = logger.level
    logger = Logger.new(File.expand_path(v))
    logger.level = original_logger_level
    @options[:logger] = logger
  end
  opts.on("-v", "--verbose", "Run verbosely") do |v|
    @options[:logger].level = Logger::DEBUG
  end
  opts.on_tail("-h", "--help", "Show this message") do
    puts opts
    exit
  end
  
end

option_parser.parse!

@options[:base_uri] = ARGV.shift
@options[:root_path] = ARGV.shift || "/"

def session
  @session ||= Restfully::Session.new(@options)
end

def root 
  @root ||= session.root.load
rescue Restfully::HTTP::Error => e
  puts "#{e.class.name}: #{e.message}"
end

require 'irb'
require 'irb/completion'
ARGV.clear
IRB.start
exit!  


# if (config_filename = @options.delete('configuration_file')) && File.exists?(File.expand_path(config_filename))
#   config = YAML.load_file(File.expand_path(config_filename))
#   @base_uri = config.delete('base_uri') || @base_uri
#   @root_path = config.delete('root_path') || @root_path
#   @options.merge!(config)
# end
# 
# unless @base_uri
#   $stderr.puts option_parser.help
#   exit(-1)
# else
#   if (log_file=@options.delete('log'))
#     @logger = Logger.new(File.expand_path(log_file))
#   else
#     @logger = Logger.new(STDOUT)
#   end
#   if @options.delete('verbose')
#     @logger.level = Logger::DEBUG
#   else
#     @logger.level = Logger::WARN
#   end
# 
#   def session
#     @session ||= Restfully::Session.new(@base_uri, @options.merge('root_path' => @root_path, 'logger' => @logger))
#   end
#   def root 
#     @root ||= Restfully::Resource.new(session.root_path, session).load
#   end
#   
#   root # preloads
#   
#   require 'irb'
#   require 'irb/completion'
#   
#   ARGV.clear
#   IRB.start
#   exit!
# end