package path

import (
	"context"
	"path"

	"github.com/MontFerret/ferret/pkg/runtime/core"
	"github.com/MontFerret/ferret/pkg/runtime/values"
	"github.com/MontFerret/ferret/pkg/runtime/values/types"
)

// JOIN joins any number of path elements into a single path, separating them with slashes.
// @param {String, repeated | String[]} elements - The path elements
// @return {String} - Single path from the given elements.
func Join(_ context.Context, args ...core.Value) (core.Value, error) {

	argsCount := len(args)
	if argsCount == 0 {
		return values.EmptyString, nil
	}

	arr := &values.Array{}

	if argsCount != 1 && args[0].Type() != types.Array {
		arr = values.NewArrayWith(args...)
	} else {
		arr = args[0].(*values.Array)
	}

	elems := make([]string, arr.Length())

	for idx := values.NewInt(0); idx < arr.Length(); idx++ {
		arrElem := arr.Get(idx)
		err := core.ValidateType(arrElem, types.String)

		if err != nil {
			return values.None, err
		}

		elems[idx] = arrElem.String()
	}

	return values.NewString(path.Join(elems...)), nil
}