package impl

import (
	"context"
	"testing"

	"github.com/stretchr/testify/require"
	"github.com/stretchr/testify/suite"
	backup_model_mock "github.com/tidbcloud/dataflow-service/app/models/backup/mock"
	"github.com/tidbcloud/dataflow-service/app/repo"
	repo_mock "github.com/tidbcloud/dataflow-service/app/repo/mock"
	workflow_mock "github.com/tidbcloud/dataflow-service/app/workflow/mock"
	grpcli_mock "github.com/tidbcloud/dataflow-service/pkg/grpc/grpcli/mock"
	infraapi_mock "github.com/tidbcloud/dataflow-service/pkg/infra-api/mock"
	"gorm.io/gorm"
)

type backupHealthCheckerTestSuit struct {
	suite.Suite
	db *gorm.DB

	mockBackupRepo         *repo_mock.BackupRepo
	mockBackupExportRepo   *repo_mock.BackupExportRepo
	mockLogBackupRepo      *repo_mock.LogBackupRepo
	mockBackupScheduleRepo *repo_mock.BackupScheduleRepo

	mockBackupSettingModel *backup_model_mock.BackupSettingModel

	mockCoreGrpcClient       *grpcli_mock.CoreGrpcClient
	mockMgmtGrpcClient       *grpcli_mock.MgmtSvcGrpcClient
	mockBackupRegionalFacade *infraapi_mock.BackupFacade
	mockWorkflowModel        *workflow_mock.Workflow
}

func TestBackupHealthCheckerTestSuit(t *testing.T) {
	suite.Run(t, new(backupHealthCheckerTestSuit))
}

func (s *backupHealthCheckerTestSuit) SetupSuite() {
	testDB, err := repo.GetFakeDB()
	require.NoError(s.T(), err)
	s.db = testDB
	s.mockBackupRepo = repo_mock.NewBackupRepo(s.T())
	s.mockBackupExportRepo = repo_mock.NewBackupExportRepo(s.T())
	s.mockLogBackupRepo = repo_mock.NewLogBackupRepo(s.T())
	s.mockBackupScheduleRepo = repo_mock.NewBackupScheduleRepo(s.T())
	s.mockBackupSettingModel = backup_model_mock.NewBackupSettingModel(s.T())
	s.mockCoreGrpcClient = grpcli_mock.NewCoreGrpcClient(s.T())
	s.mockMgmtGrpcClient = grpcli_mock.NewMgmtSvcGrpcClient(s.T())
	s.mockBackupRegionalFacade = infraapi_mock.NewBackupFacade(s.T())
	s.mockWorkflowModel = workflow_mock.NewWorkflow(s.T())
}

func (s *backupHealthCheckerTestSuit) TestCheckBackupNodeGroupAndNodePoolCleanUp() {
	ctx := context.Background()
	backupHealthChecker := NewBackupHealthChecker(s.mockBackupRepo, s.mockBackupExportRepo, s.mockLogBackupRepo, s.mockBackupScheduleRepo,
		s.mockBackupSettingModel, s.mockCoreGrpcClient, s.mockMgmtGrpcClient, s.mockBackupRegionalFacade, s.mockWorkflowModel)
	err := backupHealthChecker.CheckBackupNodeGroupAndNodePoolCleanUp(ctx)
	require.NoError(s.T(), err)
}
