package idx

import (
	"github.com/seaweedfs/seaweedfs/weed/storage/types"
)

// firstInvalidIndex find the first index the failed lessThanOrEqualToFn function's requirement.
func FirstInvalidIndex(bytes []byte, lessThanOrEqualToFn func(key types.NeedleId, offset types.Offset, size types.Size) (bool, error)) (int, error) {
	left, right := 0, len(bytes)/types.NeedleMapEntrySize-1
	index := right + 1
	for left <= right {
		mid := left + (right-left)>>1
		loc := mid * types.NeedleMapEntrySize
		key := types.BytesToNeedleId(bytes[loc : loc+types.NeedleIdSize])
		offset := types.BytesToOffset(bytes[loc+types.NeedleIdSize : loc+types.NeedleIdSize+types.OffsetSize])
		size := types.BytesToSize(bytes[loc+types.NeedleIdSize+types.OffsetSize : loc+types.NeedleIdSize+types.OffsetSize+types.SizeSize])
		res, err := lessThanOrEqualToFn(key, offset, size)
		if err != nil {
			return -1, err
		}
		if res {
			left = mid + 1
		} else {
			index = mid
			right = mid - 1
		}
	}
	return index, nil
}
