package blobovnicza

import (
	"context"
	"os"
	"path/filepath"
	"testing"

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

func TestBlobovnicza_Get(t *testing.T) {
	t.Run("re-configure object size limit", func(t *testing.T) {
		filename := filepath.Join(t.TempDir(), "blob")

		var blz *Blobovnicza

		t.Cleanup(func() {
			blz.Close()
			os.RemoveAll(filename)
		})

		fnInit := func(szLimit uint64) {
			if blz != nil {
				require.NoError(t, blz.Close())
			}

			blz = New(
				WithPath(filename),
				WithObjectSizeLimit(szLimit),
			)

			require.NoError(t, blz.Open())
			require.NoError(t, blz.Init())
		}

		// initial distribution: [0:32K] (32K:64K]
		fnInit(2 * firstBucketBound)

		addr := oidtest.Address()
		obj := make([]byte, firstBucketBound+1)

		exists, err := blz.Exists(addr)
		require.NoError(t, err)
		require.False(t, exists)

		var prmPut PutPrm
		prmPut.SetAddress(addr)
		prmPut.SetMarshaledObject(obj)

		// place object to [32K:64K] bucket
		_, err = blz.Put(prmPut)
		require.NoError(t, err)

		var prmGet GetPrm
		prmGet.SetAddress(addr)

		checkObj := func() {
			res, err := blz.Get(context.Background(), prmGet)
			require.NoError(t, err)
			require.Equal(t, obj, res.Object())

			exists, err := blz.Exists(addr)
			require.NoError(t, err)
			require.True(t, exists)
		}

		// object should be available
		checkObj()

		// new distribution (extended): [0:32K] (32K:64K] (64K:128K]
		fnInit(3 * firstBucketBound)

		// object should be still available
		checkObj()

		// new distribution (shrunk): [0:32K]
		fnInit(firstBucketBound)

		// object should be still available
		checkObj()
	})
}