package kv

import (
	"bytes"
	"context"

	"github.com/prysmaticlabs/prysm/encoding/bytesutil"
	bolt "go.etcd.io/bbolt"
)

// SaveGraffitiOrderedIndex writes the current graffiti index to the db
func (s *Store) SaveGraffitiOrderedIndex(ctx context.Context, index uint64) error {
	return s.db.Update(func(tx *bolt.Tx) error {
		bkt := tx.Bucket(graffitiBucket)
		indexBytes := bytesutil.Uint64ToBytesBigEndian(index)
		return bkt.Put(graffitiOrderedIndexKey, indexBytes)
	})
}

// GraffitiOrderedIndex fetches the ordered index, resetting if the file hash changed
func (s *Store) GraffitiOrderedIndex(ctx context.Context, fileHash [32]byte) (uint64, error) {
	orderedIndex := uint64(0)
	err := s.db.Update(func(tx *bolt.Tx) error {
		bkt := tx.Bucket(graffitiBucket)
		dbFileHash := bkt.Get(graffitiFileHashKey)
		if bytes.Equal(dbFileHash, fileHash[:]) {
			indexBytes := bkt.Get(graffitiOrderedIndexKey)
			orderedIndex = bytesutil.BytesToUint64BigEndian(indexBytes)
		} else {
			indexBytes := bytesutil.Uint64ToBytesBigEndian(0)
			if err := bkt.Put(graffitiOrderedIndexKey, indexBytes); err != nil {
				return err
			}
			return bkt.Put(graffitiFileHashKey, fileHash[:])
		}
		return nil
	})
	return orderedIndex, err
}
