package serverlessdb_operator

import (
	. "github.com/onsi/ginkgo/v2"
	. "github.com/onsi/gomega"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

	. "gitcode.com/openFuyao/e2e-auto-test/e2e/serverlessdb-operator/utils"
)

var _ = Describe("ServerlessDB 实例释放",
	Label("serverlessdb-operator", "with-workload-cluster", "26.01"), Label("P0"), func() {

		It("serverlessdb-IT-009:释放实例后 DBInstance 与 Pod 被删除", func() {
			poolName := "pool-it009"
			createPoolAndAwaitWarm(poolName, 1)
			appRef := "app-it009"

			allocateAndAwaitRunning(appRef)

			By("调用释放接口")
			status, err := apiClient.Release(ctx, testNs, appRef)
			Expect(err).NotTo(HaveOccurred())
			Expect(status).To(Equal(204), "释放应当返回 204")

			By("DBInstance 被删除")
			Eventually(func(g Gomega) int {
				list, err := ListDBInstances(ctx, k8sClient, testNs, LabelEq(LabelAppRef, appRef))
				g.Expect(err).NotTo(HaveOccurred())
				return len(list.Items)
			}, reconcileWait, reconcilePoll).Should(Equal(0))

			By("Backing Pod 被级联删除")
			Eventually(func(g Gomega) int {
				pods, perr := k8sClient.ListPods(ctx, testNs, metav1.ListOptions{LabelSelector: LabelEq(LabelAppRef, appRef)})
				g.Expect(perr).NotTo(HaveOccurred())
				return len(pods.Items)
			}, reconcileWait, reconcilePoll).Should(Equal(0))
		})

		It("serverlessdb-IT-010:释放后资源池自动补齐 WarmReady 实例", func() {
			poolName := "pool-it010"
			createPoolAndAwaitWarm(poolName, 2)
			appRef := "app-it010"

			allocateAndAwaitRunning(appRef)

			By("释放实例")
			_, _ = apiClient.Release(ctx, testNs, appRef)

			By("等待 pool 重新补齐到 replicas=2")
			awaitPoolInstanceCount(poolName, 2)
			Eventually(func(g Gomega) bool {
				list, err := ListDBInstances(ctx, k8sClient, testNs, LabelEq(LabelDBPool, poolName))
				g.Expect(err).NotTo(HaveOccurred())
				for i := range list.Items {
					if DBInstancePhase(&list.Items[i]) == "WarmReady" {
						return true
					}
				}
				return false
			}, reconcileWait, reconcilePoll).Should(BeTrue(), "应当补齐出 WarmReady 实例")
		})
	})