# frozen_string_literal: true

require 'connection_pool'
require 'http'
require 'minfraud'
require 'minfraud/enum'
require 'minfraud/validates'
require 'minfraud/components/base'
require 'minfraud/components/account'
require 'minfraud/components/addressable'
require 'minfraud/components/billing'
require 'minfraud/components/credit_card'
require 'minfraud/components/custom_inputs'
require 'minfraud/components/device'
require 'minfraud/components/email'
require 'minfraud/components/event'
require 'minfraud/components/order'
require 'minfraud/components/payment'
require 'minfraud/components/report/transaction'
require 'minfraud/components/shipping'
require 'minfraud/components/shopping_cart'
require 'minfraud/components/shopping_cart_item'
require 'minfraud/resolver'
require 'minfraud/version'
require 'minfraud/errors'
require 'minfraud/http_service/response'
require 'minfraud/error_handler'
require 'minfraud/assessments'
require 'minfraud/report'

# This class holds global configuration parameters and provides a namespace
# for the gem's classes.
module Minfraud
  class << self
    # The MaxMind account ID that is used for authorization.
    #
    # @return [Integer, nil]
    attr_accessor :account_id

    # Enable client side validation. This is disabled by default.
    #
    # @return [Boolean, nil]
    attr_accessor :enable_validation

    # The host to use when connecting to the web service.
    # By default, the client connects to the production host. However,
    # during testing and development, you can set this option to
    # 'sandbox.maxmind.com' to use the Sandbox environment's host. The
    # sandbox allows you to experiment with the API without affecting your
    # production data.
    #
    # @return [String, nil]
    attr_accessor :host

    # The MaxMind license key that is used for authorization.
    #
    # @return [String, nil]
    attr_accessor :license_key

    # @!visibility private
    attr_reader :connection_pool

    # Yield self to accept configuration settings.
    #
    # @yield [self]
    def configure
      yield self

      pool_size        = 5
      host             = @host.nil? ? 'minfraud.maxmind.com' : @host
      @connection_pool = ConnectionPool.new(size: pool_size) do
        make_http_client.persistent("https://#{host}")
      end
    end

    private

    def make_http_client
      HTTP.basic_auth(
        user: @account_id,
        pass: @license_key,
      ).headers(
        accept:     'application/json',
        user_agent: "minfraud-api-ruby/#{Minfraud::VERSION} ruby/#{RUBY_VERSION} http/#{HTTP::VERSION}",
      )
    end
  end
end