package getsvc

import (
	"context"

	"go.uber.org/zap"
)

func (exec *execCtx) executeOnContainer() {
	if exec.isLocal() {
		exec.log.Debug("return result directly")
		return
	}

	exec.log.Debug("trying to execute in container...")

	traverser, ok := exec.generateTraverser(exec.address())
	if !ok {
		return
	}

	ctx, cancel := context.WithCancel(exec.context())
	defer cancel()

	exec.status = statusUndefined

loop:
	for {
		addrs := traverser.Next()
		if len(addrs) == 0 {
			exec.log.Debug("no more nodes, abort placement iteration")
			break
		}

		for i := range addrs {
			select {
			case <-ctx.Done():
				exec.log.Debug("interrupt placement iteration by context",
					zap.String("error", ctx.Err().Error()),
				)
				break loop
			default:
			}

			// TODO: consider parallel execution
			// TODO: consider optimization: if status == SPLIT we can continue until
			//  we reach the best result - split info with linking object ID.
			if exec.processNode(ctx, addrs[i]) {
				exec.log.Debug("completing the operation")
				break loop
			}
		}
	}
}