package asset

import (
	"context"
	"testing"

	. "github.com/onsi/ginkgo/v2"
	. "github.com/onsi/gomega"

	"github.com/tidbcloud/devops/pkg/infra/log"
	"github.com/tidbcloud/devops/pkg/infra/utils/test"
)

func TestAsset(t *testing.T) {
	RegisterFailHandler(Fail)
	RunSpecs(t, "Asset Suite", test.ReporterConfig())
}

var _ = Describe("[Asset]", func() {
	var fw = test.Framework()
	var ctx context.Context
	var asset Asset

	BeforeEach(func() {
		ctx = log.NewContext(context.Background(), fw.Logger)
	})

	Describe("[FileAsset]", func() {
		BeforeEach(func() {
			var err error
			asset = NewFileAsset(".")
			Expect(err).To(BeNil())
		})

		Context("Root Bucket", func() {
			PIt("Read/Write/Delete", func() {
				bucket, err := asset.Bucket(ctx)
				Expect(err).To(BeNil())

				err = bucket.WriteAll(ctx, "test.txt", []byte("hello world"), nil)
				Expect(err).To(BeNil())

				data, err := bucket.ReadAll(ctx, "test.txt")
				Expect(err).To(BeNil())
				Expect(string(data)).To(Equal("hello world"))

				err = bucket.Delete(ctx, "test.txt")
				Expect(err).To(BeNil())

				_, err = bucket.ReadAll(ctx, "test.txt")
				Expect(err).To(HaveOccurred())

				err = bucket.Close()
				Expect(err).To(BeNil())
			})
		})

		Context("With Prefix", func() {
			var prefixAsset Asset
			BeforeEach(func() {
				prefixAsset = asset.Sub("prefix1", "prefix2")
			})

			PIt("Read/Write/Delete", func() {
				prefixBucket, err := prefixAsset.Bucket(ctx)
				Expect(err).To(BeNil())

				rootBucket, err := asset.Bucket(ctx)
				Expect(err).To(BeNil())

				err = prefixBucket.WriteAll(ctx, "test.txt", []byte("hello world"), nil)
				Expect(err).To(BeNil())

				data, err := prefixBucket.ReadAll(ctx, "test.txt")
				Expect(err).To(BeNil())
				Expect(string(data)).To(Equal("hello world"))

				// read from root bucket with full path
				data, err = rootBucket.ReadAll(ctx, "/prefix1/prefix2/test.txt")
				Expect(err).To(BeNil())
				Expect(string(data)).To(Equal("hello world"))

				err = prefixBucket.Delete(ctx, "test.txt")
				Expect(err).To(BeNil())

				_, err = prefixBucket.ReadAll(ctx, "test.txt")
				Expect(err).To(HaveOccurred())

				err = prefixBucket.Close()
				Expect(err).To(BeNil())
				err = rootBucket.Close()
				Expect(err).To(BeNil())

			})
		})
	})
})
