package system

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

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

	"github.com/tidbcloud/AgentTeam/desktop/internal/profile"
)

func TestDaemonLogHandlerReturnsRecentLogLines(t *testing.T) {
	configDir := t.TempDir()
	logDir := filepath.Join(configDir, "logs")
	logPath := filepath.Join(logDir, "agentteam.log")
	require.NoError(t, os.MkdirAll(logDir, 0o755))
	require.NoError(t, os.WriteFile(logPath, []byte("one\ntwo\nthree\n"), 0o644))
	t.Setenv(profile.ConfigDirEnvKey, configDir)
	require.NoError(t, os.WriteFile(filepath.Join(configDir, "config.yaml"), []byte("log:\n  dir: "+logDir+"\n  file: agentteam.log\n"), 0o600))

	router := newDaemonLogTestRouter()
	req := httptest.NewRequest(http.MethodGet, "/logs/daemon?tail=2", nil)
	rec := httptest.NewRecorder()
	router.ServeHTTP(rec, req)

	require.Equal(t, http.StatusOK, rec.Code, rec.Body.String())
	var body DaemonLogResponse
	require.NoError(t, json.Unmarshal(rec.Body.Bytes(), &body))
	require.True(t, body.Exists)
	require.Equal(t, logPath, body.Path)
	require.Equal(t, 2, body.Limit)
	require.Equal(t, []string{"two", "three"}, body.Lines)
	require.Positive(t, body.Size)
	require.NotEmpty(t, body.UpdatedAt)
}

func TestDaemonLogHandlerReturnsEmptyWhenLogMissing(t *testing.T) {
	configDir := t.TempDir()
	logDir := filepath.Join(configDir, "logs")
	t.Setenv(profile.ConfigDirEnvKey, configDir)
	require.NoError(t, os.WriteFile(filepath.Join(configDir, "config.yaml"), []byte("log:\n  dir: "+logDir+"\n  file: agentteam.log\n"), 0o600))

	router := newDaemonLogTestRouter()
	req := httptest.NewRequest(http.MethodGet, "/logs/daemon", nil)
	rec := httptest.NewRecorder()
	router.ServeHTTP(rec, req)

	require.Equal(t, http.StatusOK, rec.Code, rec.Body.String())
	var body DaemonLogResponse
	require.NoError(t, json.Unmarshal(rec.Body.Bytes(), &body))
	require.False(t, body.Exists)
	require.Equal(t, 500, body.Limit)
	require.Empty(t, body.Lines)
}

func newDaemonLogTestRouter() *gin.Engine {
	gin.SetMode(gin.TestMode)
	router := gin.New()
	router.GET("/logs/daemon", NewDaemonLogHandler())
	return router
}
