package shard

import (
	"context"
	"os"
	"testing"

	shardconfig "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-node/config/engine/shard"
	"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/internal/testutil"
	oidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id/test"
	"github.com/stretchr/testify/require"
)

func BenchmarkRefillMetabase(b *testing.B) {
	b.Run("100 objects", func(b *testing.B) {
		benchRefillMetabase(b, 100)
	})

	b.Run("1000 objects", func(b *testing.B) {
		benchRefillMetabase(b, 1000)
	})

	b.Run("2000 objects", func(b *testing.B) {
		benchRefillMetabase(b, 2000)
	})

	b.Run("5000 objects", func(b *testing.B) {
		benchRefillMetabase(b, 5000)
	})
}

func benchRefillMetabase(b *testing.B, objectsCount int) {
	sh := newCustomShard(b, false, shardOptions{
		additionalShardOptions: []Option{WithRefillMetabaseWorkersCount(shardconfig.RefillMetabaseWorkersCountDefault)},
	})

	defer func() { require.NoError(b, sh.Close()) }()

	var putPrm PutPrm

	for i := 0; i < objectsCount/2; i++ {
		obj := testutil.GenerateObject()
		testutil.AddAttribute(obj, "foo", "bar")
		testutil.AddPayload(obj, 1<<5) // blobvnicza tree obj

		putPrm.SetObject(obj)

		_, err := sh.Put(context.Background(), putPrm)
		require.NoError(b, err)
	}

	for i := 0; i < objectsCount/2; i++ {
		obj := testutil.GenerateObject()
		testutil.AddAttribute(obj, "foo", "bar")
		obj.SetID(oidtest.ID())
		testutil.AddPayload(obj, 1<<20) // fstree obj

		putPrm.SetObject(obj)

		_, err := sh.Put(context.Background(), putPrm)
		require.NoError(b, err)
	}

	require.NoError(b, sh.Close())
	require.NoError(b, os.Remove(sh.metaBase.DumpInfo().Path))

	require.NoError(b, sh.Open(context.Background()))
	sh.cfg.refillMetabase = true

	b.ReportAllocs()
	b.ResetTimer()

	require.NoError(b, sh.Init(context.Background()))

	require.NoError(b, sh.Close())
}