package deploy

import (
	"context"
	"testing"

	"github.com/stretchr/testify/require"
	"github.com/tidbcloud/cluster-service-ng/domain/entity"
	o11yv2 "github.com/tidbcloud/observability/agent-control-server/api/v2"
	"k8s.io/apimachinery/pkg/runtime"
	"k8s.io/apimachinery/pkg/types"
	"sigs.k8s.io/controller-runtime/pkg/client/fake"
)

func TestBackfillO11yTiDBGroupAgentLabels(t *testing.T) {
	ctx := context.Background()
	scheme := runtime.NewScheme()
	require.NoError(t, o11yv2.AddToScheme(scheme))

	needsBackfill := &o11yv2.TiDBGroupAgent{}
	needsBackfill.Name = "tg-1"
	needsBackfill.Namespace = entity.GetNamespace()
	needsBackfill.Spec.ClusterID = "cluster-1"
	needsBackfill.Spec.TiDBGroup = "tg-1"

	alreadyBackfilled := &o11yv2.TiDBGroupAgent{}
	alreadyBackfilled.Name = "tg-2"
	alreadyBackfilled.Namespace = entity.GetNamespace()
	alreadyBackfilled.Labels = map[string]string{
		entity.O11yTiDBGroupAgentClusterIDLabelKey: "cluster-2",
		entity.O11yTiDBGroupAgentGroupIDLabelKey:   "tg-2",
	}
	alreadyBackfilled.Spec.ClusterID = "cluster-2"
	alreadyBackfilled.Spec.TiDBGroup = "tg-2"

	noSpecIdentity := &o11yv2.TiDBGroupAgent{}
	noSpecIdentity.Name = "tg-3"
	noSpecIdentity.Namespace = entity.GetNamespace()

	kubeClient := fake.NewClientBuilder().
		WithScheme(scheme).
		WithObjects(needsBackfill, alreadyBackfilled, noSpecIdentity).
		Build()

	updated, err := backfillO11yTiDBGroupAgentLabels(ctx, kubeClient)
	require.NoError(t, err)
	require.Equal(t, 1, updated)

	var got o11yv2.TiDBGroupAgent
	require.NoError(t, kubeClient.Get(ctx, types.NamespacedName{Namespace: entity.GetNamespace(), Name: "tg-1"}, &got))
	require.Equal(t, "cluster-1", got.Labels[entity.O11yTiDBGroupAgentClusterIDLabelKey])
	require.Equal(t, "tg-1", got.Labels[entity.O11yTiDBGroupAgentGroupIDLabelKey])

	updated, err = backfillO11yTiDBGroupAgentLabels(ctx, kubeClient)
	require.NoError(t, err)
	require.Equal(t, 0, updated)
}
