package server

import (
	"context"
	"testing"

	"github.com/stretchr/testify/mock"
	"github.com/stretchr/testify/require"
	apiv1 "github.com/tidbcloud/cluster-service-ng/api/cluster-service-ng/v1beta"
	"github.com/tidbcloud/cluster-service-ng/domain/entity"
	"github.com/tidbcloud/cluster-service-ng/domain/workflow/dag"
	"github.com/tidbcloud/cluster-service-ng/pkg/runtime/executor"
	executormocks "github.com/tidbcloud/cluster-service-ng/pkg/runtime/executor/mocks"
)

func TestSetBrComponentConfigOrVersion_TiBRGCOnlyAppliedOnce(t *testing.T) {
	tests := []struct {
		name             string
		targetComponents []*entity.TargetComponent
	}{
		{
			name: "single tibrgc component",
			targetComponents: []*entity.TargetComponent{
				{ComponentType: apiv1.ComponentType_TIBRGC_T2_DFSGC},
			},
		},
		{
			name: "both tibrgc components",
			targetComponents: []*entity.TargetComponent{
				{ComponentType: apiv1.ComponentType_TIBRGC_T2_DFSGC},
				{ComponentType: apiv1.ComponentType_TIBRGC_T3_ARCHIVE},
			},
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			mockDagExecutor := executormocks.NewRemoteExecutor(t)
			mockDagExecutor.On("QueryRunnings", mock.Anything, dag.PlanUpgradeTiBRGC, mock.Anything).
				Return(executor.NewExecTaskIdStatus(), nil).
				Once()
			mockDagExecutor.On("Submit", mock.Anything, dag.PlanUpgradeTiBRGC, mock.Anything, mock.Anything).
				Return(nil).
				Once()

			server := &serverImpl{
				dagExecutor:    mockDagExecutor,
				sharedPoolRepo: availableSharedPoolRepoForMutationTest(),
			}

			err := server.SetBrComponentConfigOrVersion(
				context.Background(),
				"test-shared-pool",
				tt.targetComponents,
				apiv1.SetSharedPoolComponentConfigVersionRequest_CONFIG,
			)

			require.NoError(t, err)
			mockDagExecutor.AssertExpectations(t)
		})
	}
}
