package ticdc

import (
	"strings"
	"testing"
	"unicode/utf8"

	"github.com/stretchr/testify/require"
	"github.com/tidbcloud/dataflow-service/app/repo/entity"
)

func TestTruncateTiCDCChangefeedKernelErrorMessage(t *testing.T) {
	t.Run("keeps short message", func(t *testing.T) {
		record := &entity.TiCDCChangefeed{
			KernelMetrics: entity.TiCDCChangefeedKernelMetrics{
				RunningError: &entity.TiCDCChangefeedKernelRunningError{
					Message: "short error",
				},
			},
		}

		truncateTiCDCChangefeedKernelErrorMessage(record)

		require.Equal(t, "short error", record.KernelMetrics.RunningError.Message)
	})

	t.Run("keeps head and tail for long message", func(t *testing.T) {
		head := strings.Repeat("h", ticdcChangefeedKernelErrorMessageHeadBytes)
		middle := strings.Repeat("m", 128)
		tail := strings.Repeat("t", ticdcChangefeedKernelErrorMessageTailBytes)
		record := &entity.TiCDCChangefeed{
			KernelMetrics: entity.TiCDCChangefeedKernelMetrics{
				RunningError: &entity.TiCDCChangefeedKernelRunningError{
					Message: head + middle + tail,
				},
			},
		}

		truncateTiCDCChangefeedKernelErrorMessage(record)

		message := record.KernelMetrics.RunningError.Message
		require.True(t, strings.HasPrefix(message, head))
		require.True(t, strings.HasSuffix(message, tail))
		require.Contains(t, message, "...[truncated 128 bytes]...")
		require.NotContains(t, message, middle)
	})

	t.Run("preserves utf8 boundary", func(t *testing.T) {
		record := &entity.TiCDCChangefeed{
			KernelMetrics: entity.TiCDCChangefeedKernelMetrics{
				RunningError: &entity.TiCDCChangefeedKernelRunningError{
					Message: strings.Repeat("你", 3000),
				},
			},
		}

		truncateTiCDCChangefeedKernelErrorMessage(record)

		message := record.KernelMetrics.RunningError.Message
		require.True(t, utf8.ValidString(message))
		require.True(t, strings.HasPrefix(message, "你"))
		require.True(t, strings.HasSuffix(message, "你"))
		require.Contains(t, message, "...[truncated ")
	})
}
