package chainbase

import (
	"io/fs"
	"os"
	"time"

	"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/util/logger"
	"go.etcd.io/bbolt"
	"go.uber.org/zap"
)

type Option func(*cfg)

type cfg struct {
	path          string
	perm          fs.FileMode
	noSync        bool
	maxBatchDelay time.Duration
	maxBatchSize  int
	log           *logger.Logger
}

func defaultCfg() *cfg {
	return &cfg{
		perm:          os.ModePerm,
		maxBatchDelay: bbolt.DefaultMaxBatchDelay,
		maxBatchSize:  bbolt.DefaultMaxBatchSize,
		log:           &logger.Logger{Logger: zap.L()},
	}
}

func WithPath(path string) Option {
	return func(c *cfg) {
		c.path = path
	}
}

func WithPerm(perm fs.FileMode) Option {
	return func(c *cfg) {
		c.perm = perm
	}
}

func WithNoSync(noSync bool) Option {
	return func(c *cfg) {
		c.noSync = noSync
	}
}

func WithMaxBatchDelay(maxBatchDelay time.Duration) Option {
	return func(c *cfg) {
		c.maxBatchDelay = maxBatchDelay
	}
}

func WithMaxBatchSize(maxBatchSize int) Option {
	return func(c *cfg) {
		c.maxBatchSize = maxBatchSize
	}
}

func WithLogger(l *logger.Logger) Option {
	return func(c *cfg) {
		c.log = l
	}
}