package commontasks

import (
	"context"
	"testing"

	"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"

	"github.com/tidbcloud/observability/agent-control-server/pkg/consts"
	"github.com/tidbcloud/observability/agent-control-server/pkg/deploy"
	"github.com/tidbcloud/observability/agent-control-server/pkg/util"
)

func TestUpdateVersionTask_Create(t *testing.T) {
	tests := []struct {
		name      string
		version   int
		mockAgent func() client.Object
		verify    func(t *testing.T, obj client.Object, version int)
	}{
		{
			name:    "set annotation on object without existing annotations",
			version: 123,
			mockAgent: func() client.Object {
				return &corev1.Pod{
					ObjectMeta: metav1.ObjectMeta{
						Name: "test-pod",
					},
				}
			},
			verify: func(t *testing.T, obj client.Object, version int) {
				val := util.GetAnnotation(obj, consts.AnnotationKeyO11yVersion)
				assert.Equal(t, "123", val)
			},
		},
		{
			name:    "overwrite existing annotation",
			version: 456,
			mockAgent: func() client.Object {
				return &corev1.Pod{
					ObjectMeta: metav1.ObjectMeta{
						Name: "test-pod",
						Annotations: map[string]string{
							consts.AnnotationKeyO11yVersion: "111",
						},
					},
				}
			},
			verify: func(t *testing.T, obj client.Object, version int) {
				val := util.GetAnnotation(obj, consts.AnnotationKeyO11yVersion)
				assert.Equal(t, "456", val)
			},
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			obj := tt.mockAgent()
			cm := deploy.ClusterMeta{Agent: "test-agent"}
			task := NewUpdateVersionTask(obj, tt.version, cm)

			assert.Equal(t, "UpdateVersion", task.Name())
			assert.Equal(t, cm, task.ClusterMeta())

			res := task.Create(context.Background())
			assert.NoError(t, res.Error())
			assert.True(t, res.IsDoneState())

			tt.verify(t, obj, tt.version)
		})
	}
}
