package pilorama

import (
	"context"
	"os"
	"path/filepath"
	"runtime"
	"sync/atomic"
	"testing"

	cidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id/test"
	"github.com/stretchr/testify/require"
)

func getTimestamp(reorder int, ts Timestamp) Timestamp {
	base := ts / Timestamp(reorder)
	rem := ts % Timestamp(reorder)
	return base*Timestamp(reorder) + Timestamp(reorder) - rem
}

func BenchmarkCreate(b *testing.B) {
	// Use `os.TempDir` because we construct multiple times in the same test.
	tmpDir, err := os.MkdirTemp(os.TempDir(), "*")
	require.NoError(b, err)

	f := NewBoltForest(
		WithPath(filepath.Join(tmpDir, "test.db")),
		WithMaxBatchSize(runtime.GOMAXPROCS(0)))
	require.NoError(b, f.Open(context.Background(), false))
	require.NoError(b, f.Init())
	b.Cleanup(func() {
		require.NoError(b, f.Close())
		require.NoError(b, os.RemoveAll(tmpDir))
	})

	cid := cidtest.ID()
	treeID := "tree"
	ctx := context.Background()
	var index atomic.Int32
	index.Store(-1)
	b.SetParallelism(2)
	b.RunParallel(func(pb *testing.PB) {
		for pb.Next() {
			i := index.Add(1)
			op := &Move{
				Meta:   Meta{Time: getTimestamp(runtime.GOMAXPROCS(0)*2, Timestamp(i+1))},
				Child:  Node(i + 1),
				Parent: RootID,
			}
			if err := f.TreeApply(ctx, cid, treeID, op, true); err != nil {
				b.FailNow()
			}
		}
	})
}