package plan

import (
	"net/http"
	"testing"

	"github.com/stretchr/testify/require"
	"github.com/tidbcloud/AgentTeam/internal/store/storeerr"
	"github.com/tidbcloud/AgentTeam/internal/workflow/planmanage"
)

func TestClassifyErrorKeepsRevisionAndCompileDetailsDomainLocal(t *testing.T) {
	response, ok := classifyError(planmanage.RequestError{
		Kind:    storeerr.ErrConflict,
		Code:    planmanage.ErrorCodeDraftConflict,
		Message: "draft changed",
		Details: planmanage.RevisionConflictDetails{Resource: "planDraft", ExpectedRevision: 1, CurrentRevision: 2},
	})
	require.True(t, ok)
	require.Equal(t, http.StatusPreconditionFailed, response.Status)
	require.Equal(t, string(planmanage.ErrorCodeDraftConflict), response.Code)
	require.Equal(t, planmanage.RevisionConflictDetails{Resource: "planDraft", ExpectedRevision: 1, CurrentRevision: 2}, response.Details)

	response, ok = classifyError(planmanage.RequestError{
		Kind:    storeerr.ErrUnprocessable,
		Code:    planmanage.ErrorCodeCompileFailed,
		Message: "compile failed",
		Details: map[string]any{"diagnostics": []any{}},
	})
	require.True(t, ok)
	require.Equal(t, http.StatusUnprocessableEntity, response.Status)
	// The details envelope never carries a duplicate of the resolved top-level
	// diagnostics projection; empty diagnostics leave no details envelope.
	require.Nil(t, response.Details)
	require.Empty(t, response.Diagnostics)
}

func TestClassifyErrorMapsRawStoreErrorsFromAgentEditService(t *testing.T) {
	// A raw store NotFound selector collapses to the same byte-identical
	// plan_not_found contract as a wrapped Plan selector (non-enumeration).
	response, ok := classifyError(storeerr.NotFound("missing Workflow Plan"))
	require.True(t, ok)
	require.Equal(t, http.StatusNotFound, response.Status)
	require.Equal(t, "plan_not_found", response.Code)

	response, ok = classifyError(storeerr.Conflict("Workflow Plan is archived"))
	require.True(t, ok)
	require.Equal(t, http.StatusConflict, response.Status)
	require.Equal(t, "plan_request_failed", response.Code)
}

func TestClassifyErrorMapsAgentWakeActiveThroughContract(t *testing.T) {
	response, ok := classifyError(planmanage.ErrAgentWakeActive)
	require.True(t, ok)
	require.Equal(t, http.StatusConflict, response.Status)
	require.Equal(t, "workflow_agent_wake_active", response.Code)
	require.Equal(t, "plan", response.Stage, "public Plan wake-active error must carry the resolved plan stage")
	require.False(t, response.Retryable, "a plain wake-active conflict is not retryable")
	require.Empty(t, response.Details)
}
