package service

import (
	"context"
	"testing"

	"github.com/stretchr/testify/require"
	"github.com/tidbcloud/pkgv2/bizerr"
	"github.com/tidbcloud/serverless-service/internal/domain/facade/mock_facade"
	tidbmgmtservicev1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_mgmt_service/v1"
	"go.uber.org/mock/gomock"
)

func TestListClusterCDCJobs(t *testing.T) {
	ctrl := gomock.NewController(t)
	mgmtSvc := mock_facade.NewMockMgmtSvcFacade(ctrl)

	want := []*tidbmgmtservicev1.ClusterCustomStatus{
		{
			StatusId:   1,
			StatusName: "cdc-1001-100",
			StatusType: tidbmgmtservicev1.CustomStatusType_CUSTOM_STATUS_TYPE_CDC,
		},
	}
	mgmtSvc.EXPECT().
		ListClusterCDCCustomStatuses(gomock.Any(), uint64(1001)).
		Return(want, nil)

	svc := &cdcService{mgmtSvc: mgmtSvc}
	got, err := svc.ListClusterCDCJobs(context.Background(), "1001")
	require.Nil(t, err)
	require.Equal(t, want, got)
}

func TestListClusterCDCJobs_InvalidClusterID(t *testing.T) {
	svc := &cdcService{}
	_, err := svc.ListClusterCDCJobs(context.Background(), "not-a-number")
	require.NotNil(t, err)
	require.Equal(t, bizerr.ErrCodeParams, err.ErrCode())
}

func TestDeleteClusterCDCJob(t *testing.T) {
	ctrl := gomock.NewController(t)
	mgmtSvc := mock_facade.NewMockMgmtSvcFacade(ctrl)

	mgmtSvc.EXPECT().
		DeleteClusterCustomStatus(gomock.Any(), uint64(1001), uint64(42)).
		Return(nil)

	svc := &cdcService{mgmtSvc: mgmtSvc}
	err := svc.DeleteClusterCDCJob(context.Background(), "1001", 42)
	require.Nil(t, err)
}

func TestDeleteClusterCDCJob_InvalidArgs(t *testing.T) {
	svc := &cdcService{}

	err := svc.DeleteClusterCDCJob(context.Background(), "bad", 42)
	require.NotNil(t, err)
	require.Equal(t, bizerr.ErrCodeParams, err.ErrCode())

	err = svc.DeleteClusterCDCJob(context.Background(), "1001", 0)
	require.NotNil(t, err)
	require.Equal(t, bizerr.ErrCodeParams, err.ErrCode())
}
