package pogreb

import (
	"math"
	"time"

	"github.com/akrylysov/pogreb/fs"
)

// Options holds the optional DB parameters.
type Options struct {
	// BackgroundSyncInterval sets the amount of time between background Sync() calls.
	//
	// Setting the value to 0 disables the automatic background synchronization.
	// Setting the value to -1 makes the DB call Sync() after every write operation.
	// Default: 0
	BackgroundSyncInterval time.Duration

	// BackgroundCompactionInterval sets the amount of time between background Compact() calls.
	//
	// Setting the value to 0 disables the automatic background compaction.
	// Default: 0
	BackgroundCompactionInterval time.Duration

	// FileSystem sets the file system implementation.
	//
	// Default: fs.OSMMap.
	FileSystem fs.FileSystem
	rootFS     fs.FileSystem

	maxSegmentSize             uint32
	compactionMinSegmentSize   uint32
	compactionMinFragmentation float32
}

func (src *Options) copyWithDefaults(path string) *Options {
	opts := Options{}
	if src != nil {
		opts = *src
	}
	if opts.FileSystem == nil {
		opts.FileSystem = fs.OSMMap
	}
	opts.rootFS = opts.FileSystem
	opts.FileSystem = fs.Sub(opts.FileSystem, path)
	if opts.maxSegmentSize == 0 {
		opts.maxSegmentSize = math.MaxUint32
	}
	if opts.compactionMinSegmentSize == 0 {
		opts.compactionMinSegmentSize = 32 << 20
	}
	if opts.compactionMinFragmentation == 0 {
		opts.compactionMinFragmentation = 0.5
	}
	return &opts
}
