require 'calabash-cucumber/connection'

module Calabash
  module Cucumber

    # @!visibility private
    class ResponseError < RuntimeError ; end

    # @!visibility private
    module ConnectionHelpers

      # @!visibility private
      def http(*args)
        connection.http(*args)
      end

      # @!visibility private
      def connection
        Calabash::Cucumber::Connection.instance
      end

      # @!visibility private
      def response_body_to_hash(body)
        if body.nil? || body == ""
          raise ResponseError,
            "Server replied with an empty response.  Your app has probably crashed"
        end

        begin
          hash = JSON.parse(body)
        rescue TypeError, JSON::ParserError => e
          raise ResponseError,
%Q{Could not parse server response '#{body}':

#{e}

This usually means your app has crashed.
}
        end

        outcome = hash['outcome']

        case outcome
          when 'FAILURE'
            reason = hash['reason']
            if reason.nil? || reason.empty?
              hash['reason'] = 'Server provided no reason.'
            end

            details = hash['details']
            if details.nil? || details.empty?
              hash['details'] = 'Server provided no details.'
            end

          when 'SUCCESS'
            if !hash.has_key?('results')
              raise ResponseError,
%Q{Server responded with '#{outcome}'
but response #{hash} does not contain 'results' key
}
            end
          else
            raise ResponseError,
%Q{Server responded with an invalid outcome: '#{hash["outcome"]}'}
        end
        hash
      end

    end
  end
end
