package testutil

import (
	"io"
	"sort"

	"v.io/v23"
	"v.io/v23/context"
	"v.io/v23/ipc"
	"v.io/v23/naming"
)

// GlobName calls __Glob on the given object with the given pattern and returns
// a sorted list of matching object names, or an error.
func GlobName(ctx *context.T, name, pattern string) ([]string, []naming.GlobError, error) {
	client := v23.GetClient(ctx)
	call, err := client.StartCall(ctx, name, ipc.GlobMethod, []interface{}{pattern})
	if err != nil {
		return nil, nil, err
	}
	results := []string{}
	globErrors := []naming.GlobError{}
Loop:
	for {
		var gr naming.VDLGlobReply
		switch err := call.Recv(&gr); err {
		case nil:
			switch v := gr.(type) {
			case naming.VDLGlobReplyEntry:
				results = append(results, v.Value.Name)
			case naming.VDLGlobReplyError:
				globErrors = append(globErrors, v.Value)
			}
		case io.EOF:
			break Loop
		default:
			return nil, nil, err
		}
	}
	sort.Strings(results)
	if err := call.Finish(); err != nil {
		return nil, nil, err
	}
	return results, globErrors, nil
}
