module SurveyGizmo
  class << self
    attr_writer :configuration

    def configuration
      fail 'Not configured!' unless @configuration
      @configuration
    end

    def configure
      @configuration ||= Configuration.new
      yield(configuration) if block_given?
      configure_pester
    end

    def reset!
      self.configuration = Configuration.new
      Pester.configure { |c| c.environments[:survey_gizmo_ruby] = nil }
      configure_pester
      Connection.reset!
    end

    private

    def configure_pester
      default_config = {
        on_retry: Pester::Behaviors::Sleep::Constant,
        logger: configuration.logger,
        max_attempts: 2,
        delay_interval: 60,
        retry_error_classes: retryables
      }

      Pester.configure do |c|
        if c.environments[:survey_gizmo_ruby].nil?
          c.environments[:survey_gizmo_ruby] = default_config
        else
          default_config.each { |k,v| c.environments[:survey_gizmo_ruby][k] ||= v unless k == :retry_error_classes }

          # Don't set :retry_error_classes to something when user has configured nothing
          if c.environments[:survey_gizmo_ruby][:retry_error_classes].nil? && !c.environments[:survey_gizmo_ruby].has_key?(:retry_error_classes)
            c.environments[:survey_gizmo_ruby][:retry_error_classes] = retryables
          end
        end
      end
    end

    def retryables
      [
        Net::ReadTimeout,
        Faraday::Error::TimeoutError,
        SurveyGizmo::RateLimitExceededError
      ]
    end
  end

  class Configuration
    DEFAULT_REST_API_URL = 'https://restapi.surveygizmo.com'
    DEFAULT_API_VERSION = 'v4'
    DEFAULT_RESULTS_PER_PAGE = 50
    DEFAULT_TIMEOUT_SECONDS = 300

    attr_accessor :user
    attr_accessor :password

    attr_accessor :api_debug
    attr_accessor :api_url
    attr_accessor :api_version
    attr_accessor :logger
    attr_accessor :results_per_page
    attr_accessor :timeout_seconds

    def initialize
      @api_url = DEFAULT_REST_API_URL
      @api_version = DEFAULT_API_VERSION
      @results_per_page = DEFAULT_RESULTS_PER_PAGE
      @timeout_seconds = DEFAULT_TIMEOUT_SECONDS
      @logger = SurveyGizmo::Logger.new(STDOUT)
      @api_debug = ENV['GIZMO_DEBUG'].to_s =~ /^(true|t|yes|y|1)$/i
    end
  end
end