package cluster

import (
	"net/http/httptest"
	"testing"

	"github.com/gin-gonic/gin"
	"github.com/stretchr/testify/require"
	mgmtv1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_mgmt_service/v1"
	"go.opentelemetry.io/otel/trace"
)

func TestPlanReplayerEnabled(t *testing.T) {
	require.False(t, planReplayerEnabled(nil))
	require.False(t, planReplayerEnabled(&mgmtv1.Cluster{}))
	require.False(t, planReplayerEnabled(&mgmtv1.Cluster{PlanReplayerStatus: &mgmtv1.PlanReplayerStatus{Enabled: false}}))
	require.True(t, planReplayerEnabled(&mgmtv1.Cluster{PlanReplayerStatus: &mgmtv1.PlanReplayerStatus{Enabled: true}}))
}

func TestPlanReplayerMgmtUser(t *testing.T) {
	user := planReplayerMgmtUser()
	require.True(t, user.Internal)
	require.Equal(t, planReplayerInternalEmail, user.Email)
}

func TestPlanReplayerTraceID(t *testing.T) {
	traceID := trace.TraceID{1, 2, 3}
	spanContext := trace.NewSpanContext(trace.SpanContextConfig{TraceID: traceID, SpanID: trace.SpanID{1}})
	request := httptest.NewRequest("GET", "/", nil).WithContext(trace.ContextWithSpanContext(t.Context(), spanContext))
	context, _ := gin.CreateTestContext(httptest.NewRecorder())
	context.Request = request
	require.Equal(t, traceID.String(), planReplayerTraceID(context))
}

func TestPlanReplayerPageSize(t *testing.T) {
	for _, value := range []string{"", "0"} {
		got, err := planReplayerPageSize(value)
		require.NoError(t, err)
		require.Equal(t, defaultPlanReplayerPageSize, got)
	}
	got, err := planReplayerPageSize("1000")
	require.NoError(t, err)
	require.Equal(t, 1000, got)
	for _, value := range []string{"-1", "1001", "invalid"} {
		_, err := planReplayerPageSize(value)
		require.Error(t, err)
	}
}

func TestValidPlanReplayerFileName(t *testing.T) {
	for _, fileName := range []string{
		"replayer_token_123.zip",
		"replayer_a-b_c==_1787197341456204393.zip",
	} {
		require.True(t, validPlanReplayerFileName(fileName), fileName)
	}
	for _, fileName := range []string{
		"plan_replayer.zip",
		"replayer_../secret.zip",
		"replayer_path/file.zip",
		"replayer_path\\file.zip",
		"replayer_file.tar.gz",
	} {
		require.False(t, validPlanReplayerFileName(fileName), fileName)
	}
}
