#!/usr/bin/env ruby

require 'rubygems'
require 'optparse'
require 'sequel_core'

begin
  require 'sequel'
  sequel_loaded = true
rescue LoadError
end

db_opts = {}
echo = nil
env = nil
logfile = nil

opts = OptionParser.new do |opts|
  opts.banner = "Sequel: The Database Toolkit for Ruby"
  opts.define_head "Usage: sequel <uri|path> [options]"
  opts.separator ""
  opts.separator "Examples:"
  opts.separator "  sequel sqlite:///blog.db"
  opts.separator "  sequel postgres://localhost/my_blog"
  opts.separator "  sequel config/database.yml"
  opts.separator ""
  opts.separator "For more information see http://sequel.rubyforge.org"
  opts.separator ""
  opts.separator "Options:"

  opts.on("-l", "--log logfile", "log SQL statements to log file") do |v|
    logfile = v
  end
  
  opts.on("-E", "--echo", "echo SQL statements") do |v|
    echo = v
  end
  
  opts.on("-e", "--env ENV", "use environment config for database") do |env|
    env = env
  end
  
  opts.on_tail("-?", "--help", "Show this message") do
    puts opts
    exit
  end

  opts.on_tail("-v", "--version", "Show version") do
    class << Gem; attr_accessor :loaded_specs; end
    begin
    specs = Gem.loaded_specs['sequel_core']
    puts "sequel_core #{specs.version} (#{specs.date.strftime '%Y-%m-%d'})"
    if sequel_loaded
      specs = Gem.loaded_specs['sequel']
      puts "sequel #{specs.version} (#{specs.date.strftime '%Y-%m-%d'})"
    end
    rescue
      puts "No gem version found"
    end
    exit
  end
end
opts.parse!

db = ARGV.shift

if db.blank?
  puts opts
  exit
end

if logfile || echo
  require 'logger'
  db_opts[:loggers] = []
  db_opts[:loggers] << Logger.new(logfile) if logfile
  db_opts[:loggers] << Logger.new($stdout) if echo
end

if File.exist?(db)
  require 'yaml'
  db_config = YAML.load_file(db)[env || "development"]
  db_config.each {|(k,v)| db_config[k.to_sym] = db_config.delete(k)}
  db_config.merge!(db_opts)
end

begin
  if db_config
    opts = [db_config]
  else
    opts = [db, db_opts]
  end
  DB = Sequel.connect(*opts)
  DB.test_connection
rescue => e
  puts e.message
  puts e.backtrace.first
  exit
end

require 'irb'
puts "Your database is stored in DB..."
IRB.start
