package gc

import (
	"context"
	"testing"

	"github.com/golang/mock/gomock"
	regionalpb "github.com/tidbcloud/infra-provider/api/tidbcloud/regional-server/v1"
	"github.com/tidbcloud/ticdc-service/pkg/cloud/mocks"
	regioanlMocks "github.com/tidbcloud/ticdc-service/pkg/regionalservice/mocks"
)

func Test_shouldGCAppBox(t *testing.T) {
	// Test cases
	tests := []struct {
		name     string
		appBox   *regionalpb.APPBox
		expected bool
	}{
		{
			name: "should gc appbox",
			appBox: &regionalpb.APPBox{
				Status: regionalpb.APPBox_DELETING,
			},
			expected: true,
		},
		{
			name: "should not gc appbox",
			appBox: &regionalpb.APPBox{
				Status: regionalpb.APPBox_ACTIVE,
			},
			expected: false,
		},
		{
			name: "should not gc appbox",
			appBox: &regionalpb.APPBox{
				Status: regionalpb.APPBox_FAILED,
			},
			expected: false,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			result := shouldGCAppBox(tt.appBox)
			if result != tt.expected {
				t.Errorf("expected %v, got %v", tt.expected, result)
			}
		})
	}
}

func TestWorkerRun(t *testing.T) {
	// Create a mock context and logger
	ctx := context.Background()
	client := mocks.NewMockGCProvider(gomock.NewController(t))
	client.EXPECT().ListAppbox(gomock.Any()).
		Return([]string{"box1"}, nil)
	client.EXPECT().OnAppboxDeleting(gomock.Any(), "box1").
		Return(nil)
	regionalCli := regioanlMocks.NewMockClient(gomock.NewController(t))
	regionalCli.EXPECT().GetAPPBoxByID(gomock.Any(), "box1").Return(&regionalpb.APPBox{
		Status: regionalpb.APPBox_DELETING,
	}, nil)

	// Create a GC instance
	gc := NewDataPlaneGCWorker(regionalCli, client, client)
	// Run the GC worker
	err := gc.Run(ctx)
	if err != nil {
		t.Fatalf("expected no error, got %v", err)
	}
}
