package health

type Status uint8

const (
	StatusUnknown Status = 0
	StatusHealthy        = (1 << iota)
	StatusNapping
	StatusStarting
	StatusUnhealthy
	StatusError

	NumStatuses int = iota - 1

	HealthyMask = StatusHealthy | StatusNapping | StatusStarting
	IdlingMask  = StatusNapping | StatusStarting
)

func NewStatus(s string) Status {
	switch s {
	case "healthy":
		return StatusHealthy
	case "unhealthy":
		return StatusUnhealthy
	case "napping":
		return StatusNapping
	case "starting":
		return StatusStarting
	case "error":
		return StatusError
	default:
		return StatusUnknown
	}
}

func (s Status) String() string {
	switch s {
	case StatusHealthy:
		return "healthy"
	case StatusUnhealthy:
		return "unhealthy"
	case StatusNapping:
		return "napping"
	case StatusStarting:
		return "starting"
	case StatusError:
		return "error"
	default:
		return "unknown"
	}
}

func (s Status) Good() bool {
	return s&HealthyMask != 0
}

func (s Status) Bad() bool {
	return s&HealthyMask == 0
}

func (s Status) Idling() bool {
	return s&IdlingMask != 0
}