package inner

import (
	"context"
	"testing"

	"github.com/stretchr/testify/mock"
	"github.com/stretchr/testify/require"
	backup_mock "github.com/tidbcloud/dataflow-service/app/models/backup/mock"
	bucket_mock "github.com/tidbcloud/dataflow-service/app/models/bucket/mock"
	"github.com/tidbcloud/dataflow-service/app/models/domain"
	"github.com/tidbcloud/dataflow-service/app/repo/entity"
	"github.com/tidbcloud/dataflow-service/idl/pbgen/proto/dataflow"
)

func TestBackupInnerControllerGetBackupIncludesAwsKmsArn(t *testing.T) {
	const (
		backupID = uint64(101)
		bucketID = uint64(202)
		kmsArn   = "arn:aws:kms:us-west-2:123456789012:key/test-key-id"
	)

	snapshotBackupModel := backup_mock.NewSnapshotBackupModel(t)
	bucketModel := bucket_mock.NewBucketModelV2(t)
	controller := NewBackupInnerController(snapshotBackupModel, bucketModel, nil, nil, nil)

	snapshotBackupModel.On("Query", mock.Anything, mock.MatchedBy(func(req *domain.QueryBackupReq) bool {
		return req != nil && req.Filter != nil && len(req.Filter.BackupIDs) == 1 && req.Filter.BackupIDs[0] == backupID
	})).Return(&domain.QueryBackupResp{
		BackupEntity: &entity.Backup{
			Storage:        "s3://backup-bucket/backups/backup-101",
			TenantID:       1,
			ClusterID:      2,
			ClusterVersion: "v8.5.0",
			BackupSize:     1024,
			BucketSettingSnapshot: &entity.BucketSetting{
				Buckets: []entity.BackupSettingBucket{{BucketId: bucketID}},
			},
		},
	}, nil)
	bucketModel.On("GetBucket", mock.Anything, mock.MatchedBy(func(req *domain.GetBucketReq) bool {
		return req != nil && req.BucketID == bucketID
	})).Return(&domain.GetBucketResp{
		Bucket: &entity.Bucket{
			Name:      "backup-bucket",
			Regions:   []string{"us-west-2"},
			AwsKmsArn: kmsArn,
		},
	}, nil)

	resp, err := controller.GetBackup(context.Background(), &dataflow.GetBackupReq{BackupId: backupID})
	require.NoError(t, err)
	require.Len(t, resp.StorageInfos, 1)
	require.Equal(t, kmsArn, resp.StorageInfos[0].AwsKmsArn)
}
