package stomp

import (
	"github.com/go-stomp/stomp/v3/frame"
)

// The AckMode type is an enumeration of the acknowledgement modes for a
// STOMP subscription.
type AckMode int

// String returns the string representation of the AckMode value.
func (a AckMode) String() string {
	switch a {
	case AckAuto:
		return frame.AckAuto
	case AckClient:
		return frame.AckClient
	case AckClientIndividual:
		return frame.AckClientIndividual
	}
	panic("invalid AckMode value")
}

// ShouldAck returns true if this AckMode is an acknowledgement
// mode which requires acknowledgement. Returns true for all values
// except AckAuto, which returns false.
func (a AckMode) ShouldAck() bool {
	switch a {
	case AckAuto:
		return false
	case AckClient, AckClientIndividual:
		return true
	}
	panic("invalid AckMode value")
}

const (
	// No acknowledgement is required, the server assumes that the client
	// received the message.
	AckAuto AckMode = iota

	// Client acknowledges messages. When a client acknowledges a message,
	// any previously received messages are also acknowledged.
	AckClient

	// Client acknowledges message. Each message is acknowledged individually.
	AckClientIndividual
)
