package backuperr

import (
	"strings"
	"testing"

	"github.com/stretchr/testify/require"
	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	corev1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

func TestExtractFailedErrorFromBackupCR_PreferAnnotation(t *testing.T) {
	backup := &cloudv1.Backup{
		ObjectMeta: metav1.ObjectMeta{
			Annotations: map[string]string{
				backupAnnotationKeyLastFailedError: "reason=BackupFailed; message=storage mismatch",
			},
		},
	}

	require.Equal(t, "reason=BackupFailed; message=storage mismatch", ExtractFailedErrorFromBackupCR(backup))
}

func TestBuildStoredBackupError_Truncates(t *testing.T) {
	got := BuildStoredBackupError("BackupFailed", strings.Repeat("a", 5000))
	require.LessOrEqual(t, len(got), 4000)
	require.True(t, strings.HasPrefix(got, "reason=BackupFailed; message="))
}

func TestExtractFailedErrorFromBackupConditions(t *testing.T) {
	got := ExtractFailedErrorFromBackupConditions(map[cloudv1.LogSubCommandType]cloudv1.LogSubCommandStatus{
		cloudv1.LogTruncateCommand: {
			Conditions: []cloudv1.BackupCondition{
				{
					Type:    cloudv1.BackupFailed,
					Status:  corev1.ConditionTrue,
					Reason:  "TruncateFailed",
					Message: `prefix [ERROR] Error:create storage failed: bucket mismatch`,
				},
			},
		},
	})

	require.Equal(t, "reason=TruncateFailed; message=create storage failed: bucket mismatch", got)
}
