package channel

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

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

	"github.com/tidbcloud/AgentTeam/internal/api/dto"
	"github.com/tidbcloud/AgentTeam/internal/store/message"
)

func TestChannelMembershipHandlerAgentTaskSummariesDelegatesViewerScopedRead(t *testing.T) {
	t.Parallel()

	lastActivity := time.Date(2026, 6, 15, 7, 45, 0, 0, time.UTC)
	updatedAt := lastActivity.Add(time.Minute)
	store := &channelHandlerTestStore{agentTaskSummaryResult: []message.ChannelAgentTaskSummary{{
		AgentID: "agt_1",
		State:   message.ChannelAgentTaskSummaryStateWorkingInChannel,
		CurrentTask: &message.ChannelAgentCurrentTaskSummary{
			TaskID:         "tsk_1",
			ChannelID:      "chn_1",
			TaskNumber:     7,
			Title:          "Ship member summaries",
			Status:         "in_progress",
			Role:           message.ChannelAgentTaskSummaryRoleAssignee,
			Route:          "/channels/chn_1/tasks/7",
			LastActivityAt: &lastActivity,
		},
		MoreCount: 2,
		UpdatedAt: updatedAt,
	}}}
	handler := &ChannelMembershipHandler{appStore: store}

	response, err := handler.AgentTaskSummaries(channelWorkspaceRequest(gin.Param{Key: "channelId", Value: " chn_1 "}))
	require.NoError(t, err)
	require.Equal(t, "usr_1", store.agentTaskSummaries.userID)
	require.Equal(t, "wsp_1", store.agentTaskSummaries.workspaceID)
	require.Equal(t, "chn_1", store.agentTaskSummaries.channelID)
	require.Equal(t, dto.ChannelAgentTaskSummariesResponse{Summaries: []dto.ChannelAgentTaskSummary{{
		AgentID: "agt_1",
		State:   "working_in_channel",
		CurrentTask: &dto.ChannelAgentCurrentTaskSummary{
			TaskID:         "tsk_1",
			ChannelID:      "chn_1",
			TaskNumber:     7,
			Title:          "Ship member summaries",
			Status:         "in_progress",
			Role:           "assignee",
			Route:          "/channels/chn_1/tasks/7",
			LastActivityAt: lastActivity.Format(time.RFC3339Nano),
		},
		MoreCount: 2,
		UpdatedAt: updatedAt.Format(time.RFC3339Nano),
	}}}, response.Body)
}

func TestChannelMembershipHandlerAgentTaskSummariesReturnsEmptyStoreResult(t *testing.T) {
	t.Parallel()

	store := &channelHandlerTestStore{}
	handler := &ChannelMembershipHandler{appStore: store}

	response, err := handler.AgentTaskSummaries(channelWorkspaceRequest(gin.Param{Key: "channelId", Value: "chn_1"}))
	require.NoError(t, err)
	require.Equal(t, dto.ChannelAgentTaskSummariesResponse{Summaries: []dto.ChannelAgentTaskSummary{}}, response.Body)
	require.Equal(t, "chn_1", store.agentTaskSummaries.channelID)
}

func TestChannelMembershipHandlerAgentTaskSummariesValidatesRequest(t *testing.T) {
	t.Parallel()

	handler := &ChannelMembershipHandler{appStore: &channelHandlerTestStore{}}

	_, err := handler.AgentTaskSummaries(channelWorkspaceRequest())
	requireHTTPError(t, err, http.StatusBadRequest, "channelId is required")
}
