package main

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/config"
	"github.com/tidbcloud/cluster-service-ng/domain/entity"
	"github.com/tidbcloud/cluster-service-ng/domain/server"
	repomocks "github.com/tidbcloud/cluster-service-ng/pkg/storage/repo/mocks"
)

func TestDisabledControlPlaneMeteringSkipsAutoBackupWrites(t *testing.T) {
	metadataWriter, dataWriter, err := buildServerMeteringWriters(&config.MeteringConfig{Enable: false})
	require.NoError(t, err)
	require.Nil(t, metadataWriter)
	require.Nil(t, dataWriter)

	tidbClusterRepo := repomocks.NewTiDBClusterRepo(t)
	tidbClusterRepo.EXPECT().Load(mock.Anything, "cluster-1", false).Return(&entity.TiDBCluster{
		Id:           "cluster-1",
		SharedPoolId: "pool-1",
	}, nil).Once()
	sharedPoolRepo := repomocks.NewSharedPoolRepo(t)
	sharedPoolRepo.EXPECT().Load(mock.Anything, "pool-1", false).Return(&entity.SharedPool{
		SharedPool: apiv1.SharedPool{
			Id:    "pool-1",
			Phase: apiv1.SharedPool_AVAILABLE,
		},
	}, nil).Once()

	ngServer, err := server.NewServer(
		"",
		"",
		nil, // transactioner
		sharedPoolRepo,
		nil, // pauseResumeOperationRepo
		nil, // dataplaneRepo
		nil, // cassandraProxyStateRepo
		nil, // nodeGroupRepo
		nil, // nodeGroupStateRepo
		nil, // dataplaneNodeGroupRepo
		tidbClusterRepo,
		nil, // tidbGroupRepo
		nil, // dmClusterRepo
		nil, // exportRepo
		nil, // lockRepo
		nil, // ruConfigRepo
		nil, // autoscalePolicyBundleRepo
		nil, // autoscaleRuntimeGuardRepo
		nil, // scaleOperationRepo
		nil, // lwRestoreRepo
		nil, // classicRestoreRepo
		nil, // manualBackupRepo
		nil, // manualBackupRestoreRepo
		nil, // scaleTikvDecisionRepo
		nil, // backupGcSettingRepo
		nil, // templateVersionSvc
		nil, // dataPlaneManager
		nil, // dataplaneClient
		nil, // clustergatewayCli
		nil, // clusterConfigClient
		nil, // dagExecutor
		nil, // imageConfig
		nil, // bizCfg
		nil, // rcuCfg
		nil, // scaleOperationCfg
		nil, // meteringConfig
		metadataWriter,
		dataWriter,
	)
	require.NoError(t, err)

	ctx := context.Background()
	require.NoError(t, ngServer.UpdateAutoBackupMetering(ctx, &apiv1.UpdateAutoBackupMeteringRequest{
		ClusterId: "cluster-1",
		SkuName:   "backup-storage-v2",
		SkuValue:  "T1",
	}))
	require.NoError(t, ngServer.ReportAutoBackupMetering(ctx, &apiv1.ReportAutoBackupMeteringRequest{
		ClusterId:    "cluster-1",
		SharedPoolId: "pool-1",
		Backups: []*apiv1.AutoBackupMeteringBackup{
			{BackupId: "backup-1", BackupSizeBytes: 1},
		},
	}))
}
