##
# Load required libraries
require "soap/wsdlDriver"

##
# Monkey patch WSDL parser to stop it moaning
module WSDL
  class Parser
    def warn(_msg)
    end
  end
end

##
# Provide interface to Quova geolocation service
module Quova
  ##
  # Access details for WSDL description
  WSDL_URL = "https://webservices.quova.com/OnDemand/GeoPoint/v1/default.asmx?WSDL"
  WSDL_USER = QUOVA_USERNAME
  WSDL_PASS = QUOVA_PASSWORD

  ##
  # Status codes
  SUCCESS = 0
  IPV6_NO_SUPPORT = 1
  INVALID_CREDENTIALS = 2
  NOT_MAPPED = 3
  INVALID_IP_FORMAT = 4
  IP_ADDRESS_NULL = 5
  ACCESS_DENIED = 6
  QUERY_LIMIT = 7
  OUT_OF_SERVICE = 10

  ##
  # Create SOAP endpoint
  @soap = SOAP::WSDLDriverFactory.new(WSDL_URL).create_rpc_driver
  @soap.options["protocol.http.basic_auth"] << [WSDL_URL, WSDL_USER, WSDL_PASS]

  ##
  # Accessor for SOAP endpoint
  def self.soap
    @soap
  end

  ##
  # Class representing geolocation details for an IP address
  class IpInfo
    def initialize(ip_address)
      @ipinfo = Quova.soap.GetIpInfo(:ipAddress => ip_address)
    end

    def status
      @ipinfo["GetIpInfoResult"]["Response"]["Status"].to_i
    end

    def country_code
      @ipinfo["GetIpInfoResult"]["Location"]["Country"]["Name"]
    end

    def country_confidence
      @ipinfo["GetIpInfoResult"]["Location"]["Country"]["Confidence"]
    end
  end
end
