package mailserver

import (
	"time"

	"github.com/status-im/status-go/eth-node/types"
)

// every this many seconds check real envelopes count
const envelopeCountCheckInterval = 60

// DB is an interface to abstract interactions with the db so that the mailserver
// is agnostic to the underlying technology used
type DB interface {
	Close() error
	// SaveEnvelope stores an envelope
	SaveEnvelope(types.Envelope) error
	// GetEnvelope returns an rlp encoded envelope from the datastore
	GetEnvelope(*DBKey) ([]byte, error)
	// Prune removes envelopes older than time
	Prune(time.Time, int) (int, error)
	// BuildIterator returns an iterator over envelopes
	BuildIterator(query CursorQuery) (Iterator, error)
}

type Iterator interface {
	Next() bool
	DBKey() (*DBKey, error)
	Release() error
	Error() error
	GetEnvelopeByBloomFilter(bloom []byte) ([]byte, error)
	GetEnvelopeByTopicsMap(topics map[types.TopicType]bool) ([]byte, error)
}

type CursorQuery struct {
	start  []byte
	end    []byte
	cursor []byte
	limit  uint32
	bloom  []byte
	topics [][]byte
}