package check

// Response is a result of a collection of health checks.
type Response struct {
	Name    string    `json:"name"`
	Status  Status    `json:"status"`
	Message string    `json:"message,omitempty"`
	Checks  Responses `json:"checks,omitempty"`
}

// HasCheck verifies whether the receiving Response has a check with the given name or not.
func (r *Response) HasCheck(name string) bool {
	found := false
	for _, check := range r.Checks {
		if check.Name == name {
			found = true
			break
		}
	}
	return found
}

// Responses is a sortable collection of Response objects.
type Responses []Response

func (r Responses) Len() int { return len(r) }

// Less defines the order in which responses are sorted.
//
// Failing responses are always sorted before passing responses. Responses with
// the same status are then sorted according to the name of the check.
func (r Responses) Less(i, j int) bool {
	if r[i].Status == r[j].Status {
		return r[i].Name < r[j].Name
	}
	return r[i].Status < r[j].Status
}

func (r Responses) Swap(i, j int) { r[i], r[j] = r[j], r[i] }