package tidbcluster

import (
	"testing"

	opv2 "github.com/pingcap/tidb-operator/api/v2/core/v1alpha1"
	"github.com/stretchr/testify/assert"
	corev1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"sigs.k8s.io/controller-runtime/pkg/client/fake"
)

func TestGetImageFromPodList(t *testing.T) {
	tests := []struct {
		name      string
		comp      string
		container string
		podList   corev1.PodList
		expected  string
	}{
		{
			name:      "happy path",
			comp:      opv2.LabelValComponentPD,
			container: opv2.ContainerNamePD,
			podList: corev1.PodList{
				Items: []corev1.Pod{
					{
						ObjectMeta: metav1.ObjectMeta{
							Namespace: "test",
							Labels: map[string]string{
								opv2.LabelKeyGroup:     "db",
								opv2.LabelKeyComponent: "pd",
								opv2.LabelKeyCluster:   "db",
							},
						},
						Spec: corev1.PodSpec{
							Containers: []corev1.Container{
								{Name: opv2.ContainerNamePD, Image: "image"},
							},
						},
					},
				},
			},
			expected: "image",
		},
		{
			name:      "container not found",
			comp:      opv2.LabelValComponentPD,
			container: opv2.ContainerNamePD,
			podList: corev1.PodList{
				Items: []corev1.Pod{
					{
						ObjectMeta: metav1.ObjectMeta{
							Namespace: "test",
							Labels: map[string]string{
								opv2.LabelKeyGroup:     "db",
								opv2.LabelKeyComponent: "pd",
								opv2.LabelKeyCluster:   "db",
							},
						},
						Spec: corev1.PodSpec{
							Containers: []corev1.Container{
								{Name: "container1", Image: "image1"},
							},
						},
					},
				},
			},
			expected: "",
		},
		{
			name:      "no pods",
			comp:      "comp1",
			container: "container1",
			podList:   corev1.PodList{},
			expected:  "",
		},
		{
			name:      "multiple pods",
			comp:      opv2.LabelValComponentTiKV,
			container: opv2.ContainerNameTiKV,
			podList: corev1.PodList{
				Items: []corev1.Pod{
					{
						ObjectMeta: metav1.ObjectMeta{
							Name:      "db-tikv-0",
							Namespace: "test",
							Labels: map[string]string{
								opv2.LabelKeyGroup:     "db",
								opv2.LabelKeyComponent: "tikv",
								opv2.LabelKeyCluster:   "db",
							},
						},
						Spec: corev1.PodSpec{
							Containers: []corev1.Container{
								{Name: opv2.ContainerNameTiKV, Image: "image1"},
							},
						},
					},
					{
						ObjectMeta: metav1.ObjectMeta{
							Name:      "db-tikv-1",
							Namespace: "test",
							Labels: map[string]string{
								opv2.LabelKeyGroup:     "db",
								opv2.LabelKeyComponent: "tikv",
								opv2.LabelKeyCluster:   "db",
							},
						},
						Spec: corev1.PodSpec{
							Containers: []corev1.Container{
								{Name: opv2.ContainerNameTiKV, Image: "image2"},
							},
						},
					},
				},
			},
			expected: "image1",
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			g := &V2Getter{Cli: fake.NewClientBuilder().WithLists(&tt.podList).Build()}
			image := g.getImageFromPodList("test", "db", tt.comp, "db", tt.container)
			assert.Equal(t, tt.expected, image)
		})
	}
}
