package agent

import (
	"errors"
	"net/http"
	"testing"

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/internal/api"
	"github.com/tidbcloud/AgentTeam/internal/store/storeerr"
)

func TestAgentWorkflowClassifiersExposeErrorsWithoutFolding(t *testing.T) {
	classifiers := map[string]func(error) (api.ErrorResponse, bool){
		"plan":       classifyAgentWorkflowPlanError,
		"invocation": classifyWorkflowInvocationError,
		"run":        classifyAgentWorkflowRunError,
	}
	for name, classify := range classifiers {
		t.Run(name, func(t *testing.T) {
			missing, ok := classify(storeerr.NotFound("missing workflow resource pln_secret"))
			require.True(t, ok)
			require.Equal(t, http.StatusNotFound, missing.Status)
			require.Contains(t, missing.Message, "pln_secret")

			forbidden, ok := classify(storeerr.Forbidden("forbidden workflow resource pln_secret"))
			require.True(t, ok)
			require.Equal(t, http.StatusForbidden, forbidden.Status)
			require.Contains(t, forbidden.Message, "forbidden")
			require.NotEqual(t, missing.Message, forbidden.Message)

			internal := storeerr.Conflict("workflow repository conflict: SELECT secret FROM workflow_rows")
			response, ok := classify(internal)
			require.True(t, ok)
			require.Equal(t, http.StatusConflict, response.Status)
			require.Contains(t, response.Message, "SELECT secret FROM workflow_rows")
		})
	}
}

func TestAgentWorkflowInternalCauseRemainsSeparatelyObservable(t *testing.T) {
	cause := errors.New("repository diagnostic")
	err := storeerr.Wrapped(storeerr.ErrConflict, "workflow conflict", cause)
	public, internal := api.ObservedErrorWithCause(err)
	require.Equal(t, "workflow conflict", public.Error())
	require.Same(t, cause, internal)
	require.Same(t, cause, storeerr.InternalCause(err))
}
