package dashboard

import (
	"encoding/json"
	"net/http"
	"net/http/httptest"
	"os"
	"path/filepath"
	"strings"
	"testing"

	"github.com/gin-gonic/gin"
	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/desktop/internal/agent"
	"github.com/tidbcloud/AgentTeam/desktop/internal/api/dto"
	"github.com/tidbcloud/AgentTeam/desktop/internal/profile"
)

func setupAgentDocsRouter(t *testing.T) *gin.Engine {
	t.Helper()

	dir := t.TempDir()
	t.Setenv(profile.ConfigDirEnvKey, dir)

	require.NoError(t, profile.Default().Agents().Add(agent.Config{
		ID:      "agent-docs-test",
		Runtime: "codex",
	}))

	gin.SetMode(gin.TestMode)
	router := gin.New()
	router.GET("/agents/:id/docs/:kind", NewGetAgentDocHandler())
	router.PUT("/agents/:id/docs/:kind", NewUpdateAgentDocHandler())
	return router
}

func TestUpdateAgentDocHandlerRejectsOversizedIdentityMarkdown(t *testing.T) {
	router := setupAgentDocsRouter(t)

	body, err := json.Marshal(dto.AgentDocRequest{
		Content: strings.Repeat("界", maxAgentDocCharacters+1),
	})
	require.NoError(t, err)

	req := httptest.NewRequest(http.MethodPut, "/agents/agent-docs-test/docs/identity", strings.NewReader(string(body)))
	req.Header.Set("Content-Type", "application/json")
	rec := httptest.NewRecorder()
	router.ServeHTTP(rec, req)

	require.Equal(t, http.StatusBadRequest, rec.Code, rec.Body.String())
	require.Contains(t, rec.Body.String(), "identity document exceeds 4096 characters")
	require.Contains(t, rec.Body.String(), "shorten the document")
}

func TestAgentDocHandlersUseCloudMemorySystemIdentity(t *testing.T) {
	router := setupAgentDocsRouter(t)
	workDir := profile.AgentWorkDir("agent-docs-test")

	req := httptest.NewRequest(http.MethodGet, "/agents/agent-docs-test/docs/identity", nil)
	rec := httptest.NewRecorder()
	router.ServeHTTP(rec, req)
	require.Equal(t, http.StatusOK, rec.Code, rec.Body.String())
	var getResp dto.AgentDocResponse
	require.NoError(t, json.Unmarshal(rec.Body.Bytes(), &getResp))
	require.Empty(t, getResp.Content)

	body, err := json.Marshal(dto.AgentDocRequest{Content: "remote identity"})
	require.NoError(t, err)
	req = httptest.NewRequest(http.MethodPut, "/agents/agent-docs-test/docs/identity", strings.NewReader(string(body)))
	req.Header.Set("Content-Type", "application/json")
	rec = httptest.NewRecorder()
	router.ServeHTTP(rec, req)
	require.Equal(t, http.StatusOK, rec.Code, rec.Body.String())

	remote, err := os.ReadFile(filepath.Join(workDir, "memory", "system", "identity.md"))
	require.NoError(t, err)
	require.Equal(t, "remote identity", string(remote))
	require.NoFileExists(t, filepath.Join(workDir, "IDENTITY.md"))
}
