require 'openssl'
require 'net/http'
require 'yajl/json_gem'
require 'benchmark'
require 'open-uri'
require 'pp'
require 'cgi'
require 'openssl'
require 'optparse'
require 'pry'

class CGI
  def self.encode_query(hash)
    return hash.map{|k,v| "#{CGI.escape(k.to_s)}=#{CGI.escape(v.to_s)}"}.join("&")
  end
end

$options = {}
ARGV << '--help' if ARGV.empty?
OptionParser.new do |parser|
  parser.on('-a USERNAME:PASSWORD', 'Account') { |value|
    $options['user'] = value.split(":")[0]
    $options['pass'] = value.split(":")[1]
  }

  parser.on('-e HOST:PORT', 'Endpoint. Default is localhost:4444') { |value|
    $options['host'] = value.split(":")[0]
    $options['port'] = value.split(":")[1].to_i
  }

  parser.on('-p PATH', 'Rest path') { |value|
    $options['path'] = value
  }

  parser.on('-m PARAMETERS', 'Paramenters (json string)') { |value|
    $options['params'] = value
  }
end.parse!

@http = Net::HTTP.new($options['host'] || 'localhost', $options['port'] || 4444)
@http.use_ssl = true
@http.verify_mode = OpenSSL::SSL::VERIFY_NONE

def login
  account = {:user => $options['user'], :pass => $options['pass'], :version => '9999123101'}
  resp = @http.request_post('/auth/login', account.to_json, nil)
  resp['Set-Cookie'] unless resp['Set-Cookie'].nil?
end

def logout
  @http.request_post('/auth/logout', nil, {'Cookie' => @cookie})
end

begin
  @cookie = login

  resp = @http.request_post($options['path'], $options['params'], {'Cookie' => @cookie})
  puts resp.body
ensure
  logout
end
