package yqlib

import (
	"container/list"
	"strconv"

	yaml "gopkg.in/yaml.v3"
)

func HasOperator(d *dataTreeNavigator, matchingNodes *list.List, pathNode *PathTreeNode) (*list.List, error) {

	log.Debugf("-- hasOperation")
	var results = list.New()

	rhs, err := d.GetMatchingNodes(matchingNodes, pathNode.Rhs)
	wanted := rhs.Front().Value.(*CandidateNode).Node
	wantedKey := wanted.Value

	if err != nil {
		return nil, err
	}

	for el := matchingNodes.Front(); el != nil; el = el.Next() {
		candidate := el.Value.(*CandidateNode)

		// grab the first value
		var contents = candidate.Node.Content
		switch candidate.Node.Kind {
		case yaml.MappingNode:
			candidateHasKey := false
			for index := 0; index < len(contents) && !candidateHasKey; index = index + 2 {
				key := contents[index]
				if key.Value == wantedKey {
					candidateHasKey = true
				}
			}
			results.PushBack(createBooleanCandidate(candidate, candidateHasKey))
		case yaml.SequenceNode:
			candidateHasKey := false
			if wanted.Tag == "!!int" {
				var number, errParsingInt = strconv.ParseInt(wantedKey, 10, 64) // nolint
				if errParsingInt != nil {
					return nil, errParsingInt
				}
				candidateHasKey = int64(len(contents)) > number
			}
			results.PushBack(createBooleanCandidate(candidate, candidateHasKey))
		default:
			results.PushBack(createBooleanCandidate(candidate, false))
		}
	}
	return results, nil
}
