require "qa/engine"
require "active_record"
require "activerecord-import"

module Qa
  extend ActiveSupport::Autoload

  autoload :Authorities
  autoload :Configuration
  autoload :Services

  # @api public
  #
  # Exposes the Questioning Authority configuration
  #
  # @yield [Qa::Configuration] if a block is passed
  # @return [Qa::Configuration]
  # @see Qa::Configuration for configuration options
  def self.config(&block)
    @config ||= Qa::Configuration.new

    yield @config if block

    @config
  end

  def self.deprecation_warning(in_msg: nil, msg:)
    return if Rails.env == 'test'
    in_msg = in_msg.present? ? "In #{in_msg}, " : ''
    warn "[DEPRECATED] #{in_msg}#{msg}  It will be removed in the next major release."
  end

  # Raised when the configuration directory for local authorities doesn't exist
  class ConfigDirectoryNotFound < StandardError; end

  # Raised when a subauthority is not passed into an authority
  class MissingSubAuthority < ArgumentError; end

  # Raised when a subauthority is not valid
  class InvalidSubAuthority < ArgumentError; end

  # Raised when a request is made to a non-configured linked data authority
  class InvalidLinkedDataAuthority < ArgumentError; end

  # Raised when a response is in an unsupported format
  class UnsupportedFormat < ArgumentError; end

  # Raised when a configuration parameter is incorrect or is required and missing
  class InvalidConfiguration < ArgumentError; end

  # Raised when a request is made for an unsupported action (e.g. :search, :term are supported)
  class UnsupportedAction < ArgumentError; end

  # Raised when a linked data request to a server returns a 503 error
  class ServiceUnavailable < ArgumentError; end

  # Raised when a linked data request to a server returns a 500 error
  class ServiceError < ArgumentError; end

  # Raised when the server returns 404 for a find term request
  class TermNotFound < ArgumentError; end

  # Raised when a required mapping parameter is missing while building an IRI Template
  module IriTemplate
    class MissingParameter < StandardError; end
  end

  # Raised when data is returned but cannot be normalized
  class DataNormalizationError < StandardError; end
end