require 'slack/response/raise_error'
require 'slack/version'

module Slack

  module Default

    # Default API entpoint
    API_ENDPOINT    = "https://slack.com/api/".freeze

    # Default User Agent header string
    USER_AGENT      = "Slack Ruby Gem #{Slack::VERSION}".freeze

    # Default media type
    MEDIA_TYPE      = "application/json"

    # Default channel type
    DEFAULT_CHANNEL = "#general"

    # Default username
    DEFAULT_USERNAME = "My Bot"

    # Default Faraday middleware stack
    MIDDLEWARE = Faraday::RackBuilder.new do |builder|
      builder.use(Faraday::Request::UrlEncoded)
      builder.use Slack::Response::RaiseError
      builder.adapter Faraday.default_adapter
    end

    class << self

      # Configuration options
      # @return [Hash]
      def options
        Hash[Slack::Configurable.keys.map{|key| [key, send(key)]}]
      end

      # Default token from ENV
      # @return [String]
      def token
        ENV['SLACK_TOKEN']
      end

      # Default team from ENV
      # @return [String]
      def team
        ENV['SLACK_TEAM']
      end

      # Default API endpoint from ENV or {API_ENDPOINT}
      # @return [String]
      def api_endpoint
        ENV['SLACK_API_ENDPOINT'] || API_ENDPOINT
      end

      # Default media type from ENV or {MEDIA_TYPE}
      # @return [String]
      def default_media_type
        ENV['SLACK_DEFAULT_MEDIA_TYPE'] || MEDIA_TYPE
      end

      # Default User-Agent header string from ENV or {USER_AGENT}
      # @return [String]
      def user_agent
        ENV['SLACK_USER_AGENT'] || USER_AGENT
      end

      # Default Channel from ENV or {DEFAULT_CHANNEL}
      # @return [String]
      def default_channel
        ENV['SLACK_DEFAULT_CHANNEL'] || DEFAULT_CHANNEL
      end

      # Default Username from ENV or {DEFAULT_USERNAME}
      # @return [String]
      def default_username
        ENV['SLACK_DEFAULT_USERNAME'] || DEFAULT_USERNAME
      end

      # Default options for Faraday::Connection
      # @return [Hash]
      def connection_options
        {
          :headers => {
            :accept => default_media_type,
            :user_agent => user_agent
          },
          :builder => middleware
        }
      end

      # Default middleware stack for Faraday::Connection
      # from {MIDDLEWARE}
      # @return [String]
      def middleware
        MIDDLEWARE
      end
    end
  end
end