#!/usr/bin/env ruby

require "optparse"
require "pp"
require "yaml"

$:.unshift(File.join(File.dirname(__FILE__), "/../lib"))
require "solusvm"

opts = {}
shell_methods = {}
shell_methods['server-create'] = "<hostname> <password> -t myimage -k xen -p myplan -i 1"
shell_methods['server-boot'] = "<vserverid>"
shell_methods['server-reboot'] = "<vserverid>"
shell_methods['server-shutdown'] = "<vserverid>"
shell_methods['server-suspend'] = "<vserverid>"
shell_methods['server-resume'] = "<vserverid>"
shell_methods['server-status'] = "<vserverid>"
shell_methods['server-addip'] = "<vserverid>"
shell_methods['server-changeplan'] = "<vserverid> <newplan>"
shell_methods['server-check-exists'] = "<vserverid>"

OptionParser.new do |o|
  o.banner = "USAGE: #{File.basename($0)} <command> [options]"
  o.on("-I", "--api-login [id]", "API ID") do |opt|
    opts[:api_id] = opt
  end

  o.on("-K", "--api-key [key]", "API KEY") do |opt|
    opts[:api_key] = opt
  end

  o.on("-N", "--node [node]", "Node to provision on") do |opt|
    opts[:node] = opt
  end

  o.on("-U", "--api-url [URL]", "URL to the API") do |opt|
    opts[:api_url] = opt
  end

  o.on("-u", "--username [username]", "The client to put the VPS under") do |opt|
    opts[:username] = opt
  end

  o.on("-k", "--kind [kind]", "Type of VPS (#{Solusvm::Server::VALID_SERVER_TYPES.join(',')})") do |opt|
    opts[:kind] = opt
  end

  o.on("-t", "--template [template]", "VPS template to boot from") do |opt|
    opts[:template] = opt
  end

  o.on("-p", "--plan [plan]", "Plan to use") do |opt|
    opts[:plan] = opt
  end

  o.on("-i", "--ips [number]", "Number of ips to add to the VPS") do |opt|
    opts[:ips] = opt.to_i
  end

  o.on("-h", "--help", "Show help documentation") do |h|
    puts o
    puts "Commands:"
    puts shell_methods.collect { |k,v| "  #{k} #{v}"}.join("\n")
    
    exit
  end
end.parse!

config_file = File.join(File.expand_path(ENV['HOME']), '.solusvm.yml')
server = Solusvm::Server.new
if ARGV.empty?
  STDERR.puts "USAGE: #{File.basename($0)} [function] [options]"
else
  if File.exists?(config_file)
    config = YAML::load(File.open(config_file))
    Solusvm.config(config['id'], config['key'], :url => config['url'])
    opts[:username] = config['username'] unless opts[:username]
  elsif opts[:api_url] && opts[:api_id] && opts[:api_key]
    Solusvm.config(opts[:api_id], opts[:api_key], :url => opts[:api_url])
  else
    puts "Must supply the api id/key and URL"
    exit
  end
  meth = ARGV[0].chomp
  if shell_methods.include?(meth)
    ARGV.shift
    if ARGV.empty?
      p shell_methods[meth]
      exit
    else
      case meth
      when 'server-create'
        unless ARGV.size == 2
          p shell_methods[meth]
          exit
        end
        p server.create(ARGV[0], ARGV[1], :plan => opts[:plan], :ips => opts[:ips], :type => opts[:kind], 
                        :username => opts[:username], :template => opts[:template], :node => opts[:node])
      when 'server-status'
        p server.status(ARGV[0])
      when 'server-boot'
        p server.boot(ARGV[0])
      when 'server-reboot'
        p server.reboot(ARGV[0])
      when 'server-suspend'
        p server.suspend(ARGV[0])
      when 'server-resume'
        p server.resume(ARGV[0])
      when 'server-check-exists'
        p server.exists?(ARGV[0])
      when 'server-terminate'
        p server.terminate(ARGV[0])
      end
    end
  else
    puts "#{meth} is not a valid function"
  end
end