package agent

import (
	"context"
	"fmt"
	"strings"

	"github.com/tidbcloud/AgentTeam/desktop/internal/agent/drivercontract"
	"github.com/tidbcloud/AgentTeam/desktop/internal/promptcompiler"
	"github.com/tidbcloud/AgentTeam/desktop/internal/types"
)

func (ap *Process) compileRuntimeMarkerPrompt(msg types.InboxMessage, marker, runtime string) (promptcompiler.CompiledPrompt, error) {
	compiler := promptcompiler.New(promptcompiler.DefaultPolicy())
	markerMsg := msg
	markerMsg.Content = marker
	markerMsg.MessageType = "runtime_delivery_receipt"
	return compiler.CompileDeliveryPrompt(context.Background(), promptcompiler.EventRoutedMessageDelivery, promptcompiler.NewEventID(promptcompiler.EventRoutedMessageDelivery), promptcompiler.CompileInput{
		AgentID: strings.TrimSpace(ap.AgentID), Runtime: strings.TrimSpace(runtime), Message: markerMsg,
		Delivery: promptcompiler.DeliveryCompileInput{
			MessageID: strings.TrimSpace(markerMsg.MessageID), Target: strings.TrimSpace(markerMsg.Target), TargetKey: strings.TrimSpace(markerMsg.TargetKey), TargetSeq: markerMsg.TargetSeq,
			ChannelType: strings.TrimSpace(markerMsg.ChannelType), ChannelName: strings.TrimSpace(markerMsg.ChannelName), Content: marker,
			Timestamp: strings.TrimSpace(markerMsg.Timestamp), MessageType: "runtime_delivery_receipt", Metadata: markerMsg.Metadata,
			DeliveryMode: "runtime_delivery_receipt", RuntimeSessionID: strings.TrimSpace(runtime), ActiveTaskTarget: markerMsg.ResolvedActiveTaskTarget(),
		},
	}, strings.TrimSpace(runtime))
}

func (ap *Process) compileGeneratedRuntimeInput(kind promptcompiler.GeneratedPromptKind, eventType promptcompiler.CompileEventType) (drivercontract.RuntimeInput, error) {
	if ap == nil || ap.driver == nil {
		return drivercontract.RuntimeInput{}, fmt.Errorf("generated runtime input requires an active driver")
	}
	compiler := promptcompiler.New(promptcompiler.DefaultPolicy())
	eventID := promptcompiler.NewEventID(eventType)
	carrier, err := compiler.CompileGeneratedPrompt(
		context.Background(), eventType, eventID,
		promptcompiler.GeneratedPromptInput{Kind: kind}, ap.driver.Name(),
	)
	if err != nil {
		return drivercontract.RuntimeInput{}, err
	}
	return drivercontract.RuntimeInput{ID: strings.TrimSpace(eventID), CompiledPrompt: &carrier}, nil
}
