package heap

import (
	"bytes"
	"sort"

	"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/pilorama"
)

type OrderedSlice struct {
	nodes  []node
	sorted bool
}
type node struct {
	filename []byte
	info     *pilorama.NodeInfo
}

func NewOrderedSlice() *OrderedSlice {
	return new(OrderedSlice)
}

func (s *OrderedSlice) Insert(infos ...pilorama.NodeInfo) {
	s.sorted = false
	for i := range infos {
		s.nodes = append(s.nodes, node{
			filename: infos[i].Meta.GetAttr(pilorama.AttributeFilename),
			info:     &infos[i],
		})
	}
}

func (s *OrderedSlice) IsEmpty() bool {
	return len(s.nodes) == 0
}

func (s *OrderedSlice) ExtractMin() pilorama.NodeInfo {
	if !s.sorted {
		sortByFilename(s.nodes)
		s.sorted = true
	}

	node := s.nodes[0]
	s.nodes = s.nodes[1:]
	return *node.info
}

func sortByFilename(nodes []node) {
	if len(nodes) == 0 {
		return
	}
	less := func(i, j int) bool {
		return bytes.Compare(nodes[i].filename, nodes[j].filename) < 0
	}
	sort.Slice(nodes, less)
}