module Spacebunny
  class DeviceKeyOrClientAndSecretRequired < Exception
    def initialize(message = nil)
      message = message || "A valid 'Api Key' or valid 'Client' and 'Secret' are required for auto-configuration"
      super(message)
    end
  end

  class DeviceKeyOrConfigurationsRequired < Exception
    def initialize(message = nil)
      message = message || 'Neither key or connection options provided!'
      super(message)
    end
  end

  class AckTypeError < Exception
    def initialize(message = nil)
      message = message || "Ack type not valid. Use one of #{Spacebunny::AmqpClient::ACK_TYPES.map{ |t| ":#{t}" }.join(', ')}"
      super(message)
    end
  end

  class BlockRequired < Exception
    def initialize(message = nil)
      message = message || 'block missing. Please provide a block'
      super(message)
    end
  end

  class ChannelsMustBeAnArray < Exception
    def initialize
      message = "channels option must be an Array. E.g. [:data, :alarms]"
      super(message)
    end
  end

  class ChannelNotExists < Exception
    def initialize(channel = nil)
      message = if channel
                  "Channel '#{channel}' does not exists. Is this channel enabled for the device or did you specified it on client initialization?"
                else
                  'Channel does not exists'
                end
      super(message)
    end
  end

  class ClientRequired < Exception
    def initialize(message = nil)
      message = message || "Missing mandatory 'client'. Spacebunny::LiveStream.new(:client => 'a_valid_client', :secret: 'a_valid_secret')"
      super(message)
    end
  end

  class LiveStreamFormatError < Exception
    def initialize
      message = "Live Stream not correctly formatted. It must be an Hash with at least 'name' and 'id' attributes"
      super(message)
    end
  end

  class LiveStreamNotFound < Exception
    def initialize(name = nil)
      message = if name
                  "Live Stream '#{name}' not found. Did you created and configured it?"
                else
                  'Live Stream not found'
                end
      super(message)
    end
  end

  class LiveStreamParamError < Exception
    def initialize(live_stream_name, param_name)
      live_stream_name = live_stream_name || 'no-name-provided'
      "Live Stream '#{live_stream_name}' misses mandatory '#{param_name}' param"
      super(message)
    end
  end

  class SecretRequired < Exception
    def initialize(message = nil)
      message = message || "Missing mandatory 'secret' Spacebunny::LiveStream.new(:client => 'a_valid_client', :secret: 'a_valid_secret')"
      super(message)
    end
  end

  class ClientNotConnected < Exception
    def initialize(message = nil)
      message = message || 'Client not connected! Check internet connection'
      super(message)
    end
  end

  class ClientNotSetup < Exception
    def initialize(message = nil)
      message = message || "'Client not setup. Did you call 'connect'?'"
      super(message)
    end
  end

  class DeviceIdMissing < Exception
    def initialize(message = nil)
      message = message || "missing mandatory 'device_id' parameter. Please provide it on client initialization (see doc) or use auto-configuration"
      super(message)
    end
  end

  class EndpointError < Exception
    def initialize(message = nil)
      message = message || 'Error while contacting endpoint for auto-configuration'
      super(message)
    end
  end

  class EndPointNotReachable < Exception
    def initialize(message = nil)
      message = message || 'Endpoint not reachable'
      super(message)
    end
  end

  class ProtocolNotRegistered < Exception
    def initialize(protocol)
      message = "protocol #{protocol} is not registered"
      super(message)
    end
  end

  class SchemeNotValid < Exception
    def initialize(scheme)
      message = "Provided scheme #{scheme} is not valid"
      super(message)
    end
  end

  class StreamsMustBeAnArray < Exception
    def initialize
      message = "streams option must be an Array"
      super(message)
    end
  end
end