package meta

import (
	"github.com/nspcc-dev/neofs-api-go/pkg/object"
	"github.com/pkg/errors"
	"go.etcd.io/bbolt"
	"go.uber.org/zap"
)

var tombstoneBucket = []byte("tombstones")

// Delete marks object as deleted.
func (db *DB) Delete(addr *object.Address) error {
	return db.delete(addr)
}

func objectRemoved(tx *bbolt.Tx, addr []byte) bool {
	tombstoneBucket := tx.Bucket(tombstoneBucket)

	return tombstoneBucket != nil && tombstoneBucket.Get(addr) != nil
}

// DeleteObjects marks list of objects as deleted.
func (db *DB) DeleteObjects(list ...*object.Address) {
	if err := db.delete(list...); err != nil {
		db.log.Error("could not delete object list",
			zap.String("error", err.Error()),
		)
	}
}

func (db *DB) delete(list ...*object.Address) error {
	return db.boltDB.Update(func(tx *bbolt.Tx) error {
		bucket, err := tx.CreateBucketIfNotExists(tombstoneBucket)
		if err != nil {
			return errors.Wrapf(err, "(%T) could not create tombstone bucket", db)
		}

		for i := range list {
			if err := bucket.Put(addressKey(list[i]), nil); err != nil {
				return errors.Wrapf(err, "(%T) could not put to tombstone bucket", db)
			}
		}

		return nil
	})
}