module SauceWhisk::RestRequestBuilder

def auth_details

def auth_details
  {:user => SauceWhisk.username, :password => SauceWhisk.password}
end

def delete(resource_id)

def delete(resource_id)
  resource_to_delete = fully_qualified_resource << "/#{resource_id}"
  make_request({:method => :delete, :url => resource_to_delete}.merge auth_details)
end

def fully_qualified_resource

def fully_qualified_resource
  return (respond_to? :resource) ? "#{SauceWhisk.base_url}/#{resource}" : SauceWhisk.base_url
end

def get(resource_to_fetch=nil)

def get(resource_to_fetch=nil)
  resource_url = fully_qualified_resource
  resource_url << "/#{resource_to_fetch}" if resource_to_fetch
  make_request({:method => :get, :url => resource_url}.merge auth_details)
end

def make_request(req_params)

def make_request(req_params)
  SauceWhisk.logger.debug "Performing Request: \n#{req_params}"
  request_from_rest_client req_params
end

def post(opts)

def post(opts)
  payload = (opts[:payload].to_json)
  resource_id = opts[:resource] || nil
  url = fully_qualified_resource
  url << "/#{resource_id}" if resource_id
  length = payload.length
  headers = {"Content-Length" => length}
  req_params = {
      :method => :post,
      :url => url,
      :content_type => "application/json",
      :headers => headers
  }
  req_params.merge!({:payload => payload}) unless payload.nil?
  make_request(req_params.merge auth_details)
end

def put(resource_id, body={})

def put(resource_id, body={})
  url = "#{fully_qualified_resource}/#{resource_id}"
  length = body.length
  headers = {"Content-Length" => length}
  req_params = {
      :method => :put,
      :url => url,
      :payload => body,
      :content_type => :json,
      :headers => headers
  }
  make_request(req_params.merge auth_details)
end

def request_from_rest_client(req_params)

def request_from_rest_client(req_params)
  tries ||= SauceWhisk.rest_retries
  RestClient::Request.execute(req_params)
rescue RestClient::ResourceNotFound => e
  if (tries -= 1) > 0
    retry
  else
    raise e
  end    
end