package channel

import (
	"net/http"
	"strings"
	"time"

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

// AgentTaskSummaries handles POST /api/channels/:channelId/agent-task-summaries.
// It returns channel-authorized task summaries for agent members visible to the viewer.
func (h *ChannelMembershipHandler) AgentTaskSummaries(r api.WorkspaceScopedRequest) (api.Response, error) {
	authenticated := r.User
	workspaceID := r.WorkspaceID()

	channelID := strings.TrimSpace(r.Gin.Param("channelId"))
	if channelID == "" {
		return api.Response{}, api.NewHTTPError(http.StatusBadRequest, "channelId is required")
	}

	summaries, err := h.appStore.ChannelAgentTaskSummariesForUser(r.Context(), authenticated.User.ID, workspaceID, channelID)
	if err != nil {
		return api.Response{}, err
	}
	return api.OK(dto.ChannelAgentTaskSummariesResponse{Summaries: toChannelAgentTaskSummaryDTOs(summaries)}), nil
}

func toChannelAgentTaskSummaryDTOs(summaries []message.ChannelAgentTaskSummary) []dto.ChannelAgentTaskSummary {
	if len(summaries) == 0 {
		return []dto.ChannelAgentTaskSummary{}
	}
	items := make([]dto.ChannelAgentTaskSummary, 0, len(summaries))
	for _, summary := range summaries {
		item := dto.ChannelAgentTaskSummary{
			AgentID:   strings.TrimSpace(summary.AgentID),
			State:     strings.TrimSpace(summary.State),
			MoreCount: summary.MoreCount,
			UpdatedAt: formatChannelAgentTaskSummaryTime(summary.UpdatedAt),
		}
		if summary.CurrentTask != nil {
			item.CurrentTask = &dto.ChannelAgentCurrentTaskSummary{
				TaskID:         strings.TrimSpace(summary.CurrentTask.TaskID),
				ChannelID:      strings.TrimSpace(summary.CurrentTask.ChannelID),
				TaskNumber:     summary.CurrentTask.TaskNumber,
				Title:          strings.TrimSpace(summary.CurrentTask.Title),
				Status:         strings.TrimSpace(summary.CurrentTask.Status),
				Role:           strings.TrimSpace(summary.CurrentTask.Role),
				Route:          strings.TrimSpace(summary.CurrentTask.Route),
				LastActivityAt: formatChannelAgentTaskSummaryOptionalTime(summary.CurrentTask.LastActivityAt),
			}
		}
		items = append(items, item)
	}
	return items
}

func formatChannelAgentTaskSummaryOptionalTime(value *time.Time) string {
	if value == nil || value.IsZero() {
		return ""
	}
	return value.UTC().Format(time.RFC3339Nano)
}

func formatChannelAgentTaskSummaryTime(value time.Time) string {
	if value.IsZero() {
		return ""
	}
	return value.UTC().Format(time.RFC3339Nano)
}
