package loadroute

import (
	"bytes"
	"errors"

	"github.com/nspcc-dev/neofs-sdk-go/container"
)

var errWrongRoute = errors.New("wrong route")

// CheckRoute checks if the route is a route correctly constructed by the builder for value a.
//
// Returns nil if route is correct, otherwise an error clarifying the inconsistency.
func CheckRoute(builder Builder, a container.SizeEstimation, route []ServerInfo) error {
	for i := 1; i < len(route); i++ {
		servers, err := builder.NextStage(a, route[:i])
		if err != nil {
			return err
		} else if len(servers) == 0 {
			break
		}

		found := false

		for j := range servers {
			if servers[j] == nil {
				// nil route point means that
				// (i-1)-th node in the route
				// must, among other things,
				// save the announcement to its
				// local memory
				continue
			}

			if bytes.Equal(servers[j].PublicKey(), route[i].PublicKey()) {
				found = true
				break
			}
		}

		if !found {
			return errWrongRoute
		}
	}

	return nil
}
