package mcp

import (
	"fmt"
	"strings"

	"github.com/tidbcloud/AgentTeam/internal/core/domain"
)

func formatAcceptedSendResult(target string, chunks []string, accepted []acceptedSendChunk, last agentSendMessageResponse) string {
	var sb strings.Builder
	if len(accepted) <= 1 {
		stateLabel := "Message sent."
		if last.State == agentSendStateAlreadySent {
			stateLabel = "Message already sent."
		}
		sb.WriteString(stateLabel)
		sb.WriteString("\n")
	} else {
		fmt.Fprintf(&sb, "Message sent in %d chunks.\n", len(accepted))
	}
	fmt.Fprintf(&sb, "destination: %s\n", target)
	if strings.TrimSpace(last.TargetKey) != "" {
		fmt.Fprintf(&sb, "targetKey: %s\n", strings.TrimSpace(last.TargetKey))
	}
	if len(accepted) == 1 {
		chunk := accepted[0]
		if chunk.MessageID != "" {
			fmt.Fprintf(&sb, "messageId: %s\n", chunk.MessageID)
			reference, targetErr := domain.ParseMessageTargetReference(target)
			if targetErr == nil && reference.Kind == domain.MessageTargetKindChannel && len(chunk.MessageID) >= 8 {
				fmt.Fprintf(&sb, "threadReplyTarget: %s:%s\n", target, chunk.MessageID[:8])
			}
		}
		if chunk.AcceptedSeq > 0 {
			fmt.Fprintf(&sb, "acceptedSeq: %d\n", chunk.AcceptedSeq)
		}
	} else {
		for _, chunk := range accepted {
			fmt.Fprintf(&sb, "chunk %d: %s", chunk.ChunkIndex+1, chunk.State)
			if chunk.MessageID != "" {
				fmt.Fprintf(&sb, " messageId=%s", chunk.MessageID)
			}
			if chunk.AcceptedSeq > 0 {
				fmt.Fprintf(&sb, " acceptedSeq=%d", chunk.AcceptedSeq)
			}
			sb.WriteString("\n")
		}
	}
	if len(chunks) > 1 && len(accepted) != len(chunks) {
		fmt.Fprintf(&sb, "chunksAccepted: %d/%d\n", len(accepted), len(chunks))
	}
	sb.WriteString("\n")
	sb.WriteString(sendMessageContinuationReminder())
	return strings.TrimSpace(sb.String())
}

func formatHeldSendResult(_ string, _ agentSendMessageResponse, refreshes ...heldSendRefresh) string {
	refresh := firstHeldSendRefresh(refreshes)
	var sections []string
	sections = append(sections, heldRefreshActionLine(false, refresh))
	if strings.TrimSpace(refresh.Text) != "" {
		sections = append(sections, strings.TrimSpace(refresh.Text))
	}
	return strings.TrimSpace(strings.Join(sections, "\n\n"))
}

func formatPartialHeldSendResult(_ string, _ int, _ []acceptedSendChunk, _ agentSendMessageResponse, refreshes ...heldSendRefresh) string {
	refresh := firstHeldSendRefresh(refreshes)
	var sections []string
	sections = append(sections, heldRefreshActionLine(true, refresh))
	if strings.TrimSpace(refresh.Text) != "" {
		sections = append(sections, strings.TrimSpace(refresh.Text))
	}
	return strings.TrimSpace(strings.Join(sections, "\n\n"))
}

const (
	heldRefreshActionReadHistory     = "message_history_read"
	heldRefreshActionReadNewMessages = "read_new_messages"
	heldRefreshActionPendingInput    = "pending_runtime_input"
)

func firstHeldSendRefresh(refreshes []heldSendRefresh) heldSendRefresh {
	if len(refreshes) == 0 {
		return heldSendRefresh{}
	}
	return refreshes[0]
}

func heldRefreshAction(refresh heldSendRefresh) string {
	if refresh.RefreshedTargetMessageCount > 0 && refresh.TargetContextRefreshComplete {
		return heldRefreshActionReadNewMessages
	}
	if refresh.RefreshedTargetMessageHasMore {
		return heldRefreshActionReadHistory
	}
	if refresh.PendingRuntimeInputCoversTarget {
		return heldRefreshActionPendingInput
	}
	return heldRefreshActionReadHistory
}
