package store

import (
	"bytes"

	cmn "github.com/tendermint/tmlibs/common"
)

// Gets the first item.
func First(st KVStore, start, end []byte) (kv cmn.KVPair, ok bool) {
	iter := st.Iterator(start, end)
	if !iter.Valid() {
		return kv, false
	}
	defer iter.Close()

	return cmn.KVPair{iter.Key(), iter.Value()}, true
}

// Gets the last item.  `end` is exclusive.
func Last(st KVStore, start, end []byte) (kv cmn.KVPair, ok bool) {
	iter := st.ReverseIterator(end, start)
	if !iter.Valid() {
		if v := st.Get(start); v != nil {
			return cmn.KVPair{cp(start), cp(v)}, true
		}
		return kv, false
	}
	defer iter.Close()

	if bytes.Equal(iter.Key(), end) {
		// Skip this one, end is exclusive.
		iter.Next()
		if !iter.Valid() {
			return kv, false
		}
	}

	return cmn.KVPair{iter.Key(), iter.Value()}, true
}
