package run

import (
	"net/http"
	"testing"
	"time"

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/internal/api/dto"
	"github.com/tidbcloud/AgentTeam/internal/workflow/calendar"
)

func TestCalendarHandlerPassesExactWindowAndReturnsClosedItemShapes(t *testing.T) {
	from := time.Date(2026, 8, 17, 16, 0, 0, 0, time.UTC)
	to := from.Add(72 * time.Hour)
	fake := &fakeCalendarService{result: calendar.Result{
		From: from, To: to,
		Items: []calendar.Item{
			{
				Kind: calendar.ItemKindRun, OccursAt: from.Add(time.Hour),
				Workflow: calendar.Workflow{PlanID: "pln_1", PlanVersionID: "plv_1", DisplayName: "Daily report"},
				Run:      &calendar.Run{ID: "wri_1", InvocationID: "wiv_1", Status: "succeeded", QueuedAt: from.Add(time.Hour)},
			},
			{
				Kind: calendar.ItemKindScheduled, OccursAt: from.Add(25 * time.Hour),
				Workflow: calendar.Workflow{PlanID: "pln_1", PlanVersionID: "plv_1", DisplayName: "Daily report"},
				Schedule: &calendar.Schedule{
					BindingID: "wbd_1", BindingRevisionID: "wbr_1", BindingSourceID: "wbs_1",
					BindingDisplayName: "Daily schedule", OccurrenceKey: "schedule:wbs_1:future",
				},
			},
		},
	}}
	handler := NewCalendarHandler(fake)

	response, err := handler.List(humanRunRequest(t, http.MethodGet,
		"/workflow/calendar?from=2026-08-17T16:00:00Z&to=2026-08-20T16:00:00Z", nil))
	require.NoError(t, err)
	require.Equal(t, &calendar.ListInput{WorkspaceID: "wsp_1", From: from, To: to}, fake.input)
	body := response.Body.(dto.WorkflowCalendarResponse)
	require.Len(t, body.Items, 2)
	require.NotNil(t, body.Items[0].Run)
	require.Nil(t, body.Items[0].Schedule)
	require.Nil(t, body.Items[1].Run)
	require.Equal(t, "wbs_1", body.Items[1].Schedule.BindingSourceID)
}

func TestCalendarHandlerRejectsMissingOrMalformedWindowBeforeService(t *testing.T) {
	fake := &fakeCalendarService{}
	handler := NewCalendarHandler(fake)

	_, err := handler.List(humanRunRequest(t, http.MethodGet, "/workflow/calendar?to=2026-08-20T16:00:00Z", nil))
	requireRunHTTPError(t, err, http.StatusBadRequest, "workflow_calendar_invalid_window")
	require.Nil(t, fake.input)

	_, err = handler.List(humanRunRequest(t, http.MethodGet, "/workflow/calendar?from=today&to=tomorrow", nil))
	requireRunHTTPError(t, err, http.StatusBadRequest, "workflow_calendar_invalid_window")
	require.Nil(t, fake.input)
}
