package exec

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

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/desktop/internal/wire/apiclient"
)

func TestScheduledMessageHandlerReturnsTypedResults(t *testing.T) {
	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		switch {
		case r.Method == http.MethodGet && r.URL.Path == "/api/v1/workspaces/ws/agents/ag/runtime/schedules":
			_, _ = io.WriteString(w, `{"schedules":[{"id":"sch-1","name":"daily","status":"active"}]}`)
		case r.Method == http.MethodGet && r.URL.Path == "/api/v1/workspaces/ws/agents/ag/runtime/schedules/sch-1/runs":
			_, _ = io.WriteString(w, `[{"id":"run-1","status":"done"}]`)
		case r.Method == http.MethodGet:
			_, _ = io.WriteString(w, `{"id":"sch-1","name":"daily","status":"active"}`)
		case r.Method == http.MethodDelete:
			w.WriteHeader(http.StatusNoContent)
		case r.URL.Path == "/api/v1/workspaces/ws/agents/ag/runtime/schedules/validate":
			_, _ = io.WriteString(w, `{"proposed":{"id":"sch-1","name":"daily","status":"active","validation":{"valid":true}}}`)
		default:
			_, _ = io.WriteString(w, `{"id":"sch-1","name":"daily","status":"active"}`)
		}
	}))
	t.Cleanup(server.Close)
	authorized := runtimeAuthorization{Server: &apiclient.Client{
		ServerURL: server.URL, RouteWorkspaceID: "ws", AgentID: "ag", AuthToken: "token", HTTPClient: server.Client(),
	}}
	h := scheduledMessageHandler{}
	list, err := h.list(context.Background(), actionScopedJSON[scheduledMessageListRequest]{Authorized: authorized})
	require.NoError(t, err)
	require.Equal(t, "sch-1", list.Data.Items[0].ID)
	get, err := h.get(context.Background(), actionScopedJSON[scheduledMessageIDRequest]{Authorized: authorized, Body: scheduledMessageIDRequest{ID: "sch-1"}})
	require.NoError(t, err)
	require.Equal(t, "sch-1", get.Data.ID)
	runs, err := h.runs(context.Background(), actionScopedJSON[scheduledMessageRunsRequest]{Authorized: authorized, Body: scheduledMessageRunsRequest{ID: "sch-1"}})
	require.NoError(t, err)
	require.Equal(t, "run-1", runs.Data.Runs[0].ID)
	write := scheduledMessageWriteRequest{
		Name: "daily", Target: "#ops", Template: "hello",
		Schedule: scheduledMessageSchedule{Kind: "every", Seconds: 60, Anchor: "2026-07-21T00:00:00Z"},
	}
	created, err := h.create(context.Background(), actionScopedJSON[scheduledMessageCreateRequest]{Authorized: authorized, Body: scheduledMessageCreateRequest{scheduledMessageWriteRequest: write}})
	require.NoError(t, err)
	require.Equal(t, "sch-1", created.Data.ID)
	validated, err := h.validate(context.Background(), actionScopedJSON[scheduledMessageValidateRequest]{Authorized: authorized, Body: scheduledMessageValidateRequest{scheduledMessageWriteRequest: write}})
	require.NoError(t, err)
	require.Equal(t, "sch-1", validated.Data.Proposed.ID)
	updated, err := h.update(context.Background(), actionScopedJSON[scheduledMessageUpdateRequest]{Authorized: authorized, Body: scheduledMessageUpdateRequest{ID: "sch-1", scheduledMessageWriteRequest: write}})
	require.NoError(t, err)
	require.Equal(t, "sch-1", updated.Data.ID)
	paused, err := h.pause(context.Background(), actionScopedJSON[scheduledMessageIDRequest]{Authorized: authorized, Body: scheduledMessageIDRequest{ID: "sch-1"}})
	require.NoError(t, err)
	require.Equal(t, "sch-1", paused.Data.ID)
	resumed, err := h.resume(context.Background(), actionScopedJSON[scheduledMessageIDRequest]{Authorized: authorized, Body: scheduledMessageIDRequest{ID: "sch-1"}})
	require.NoError(t, err)
	require.Equal(t, "sch-1", resumed.Data.ID)
	deleted, err := h.delete(context.Background(), actionScopedJSON[scheduledMessageIDRequest]{Authorized: authorized, Body: scheduledMessageIDRequest{ID: "sch-1"}})
	require.NoError(t, err)
	require.Equal(t, "sch-1", deleted.Data.ID)
}
