package common

import (
	"context"
	"fmt"
	"testing"

	. "github.com/onsi/gomega"
	"github.com/tidbcloud/infra-provider/pkg/deploy"
	"github.com/tidbcloud/infra-provider/pkg/k8s"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/config"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/controllers"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/controllers/appbox/task"
	corev1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"sigs.k8s.io/controller-runtime/pkg/client/fake"
)

func TestDataflowDelete(t *testing.T) {
	cases := map[string]struct {
		service *corev1.Service
		expect  func(g *WithT, res deploy.Result)
	}{
		"empty client": {
			service: &corev1.Service{
				ObjectMeta: metav1.ObjectMeta{
					Name:      "dataflow-agent",
					Namespace: "tidb-admin",
				},
			},
			expect: func(g *WithT, res deploy.Result) {
				g.Expect(res).To(Equal(deploy.Done()))
			},
		},
		"service present": {
			service: &corev1.Service{
				ObjectMeta: metav1.ObjectMeta{
					Name:      "dataflow-agent",
					Namespace: "tidb-admin",
				},
			},
			expect: func(g *WithT, res deploy.Result) {
				g.Expect(res.Error()).ShouldNot(BeNil())
				g.Expect(res.Error().Error()).To(ContainSubstring(fmt.Sprintf("%v still exist", "dataflow-agent")))
			},
		},
		"service deleted": {
			service: nil,
			expect: func(g *WithT, res deploy.Result) {
				g.Expect(res).To(Equal(deploy.Done()))
			},
		},
	}

	for n, c := range cases {
		t.Run(n, func(t *testing.T) {
			g := NewWithT(t)
			cli := fake.NewClientBuilder().Build()
			if c.service != nil {
				g.Expect(cli.Create(context.Background(), c.service)).To(Succeed())
			}
			task := NewDataflowAgent(&task.Context{
				Remote: &controllers.MockClientGetter{Client: cli},
				DPTmplConfig: &config.DPTemplateConfig{
					DataflowAgent: config.InfraComponentConfig{
						ReleaseName: "dataflow-agent",
						Namespace:   "tidb-admin",
					},
				},
			})
			if n == "empty client" {
				task.Remote = &k8s.EmptyGetter{}
			}
			c.expect(g, task.Delete(context.Background()))
		})
	}
}
