// Send a follow-up into a running Ask session.
//
// Documented at https://appcd-dev.github.io/stackgen-sdk/code-samples/ask-steer-followup/
//
//	go run ./examples/go/ask/ask-steer-followup.go --message "Investigate checkout latency"
package main

import (
	"context"
	"crypto/rand"
	"encoding/hex"
	"flag"
	"fmt"
	"os"
	"strings"
	"time"

	stackgen "github.com/appcd-dev/stackgen-sdk/clients/go"
	"github.com/appcd-dev/stackgen-sdk/clients/go/aiden"
)

// envOr returns the first non-empty environment variable among keys.
func envOr(keys ...string) string {
	for _, key := range keys {
		if v := strings.TrimSpace(os.Getenv(key)); v != "" {
			return v
		}
	}
	return ""
}

func main() {
	message := flag.String("message", "Investigate a synthetic checkout latency spike", "Initial Ask message")
	followUp := flag.String("follow-up", "Also check recent deploy markers before you finish", "Mid-session follow-up")
	workflow := flag.String("workflow", envOr("STACKGEN_WORKFLOW"), "Optional workflow entity_ref")
	timeoutSeconds := flag.Int("timeout-seconds", 600, "Subscribe timeout")
	flag.Parse()
	base, token, org := envOr("STACKGEN_URL"), envOr("STACKGEN_TOKEN"), envOr("STACKGEN_WORKSPACE_ID", "STACKGEN_PROJECT")
	if base == "" || token == "" || org == "" {
		fmt.Fprintln(os.Stderr, "set STACKGEN_URL, STACKGEN_TOKEN, and STACKGEN_WORKSPACE_ID")
		os.Exit(2)
	}
	client, err := stackgen.NewClient(stackgen.Config{
		BaseURL:        base,
		APIToken:       token,
		WorkspaceID:    org,
		TimeoutSeconds: *timeoutSeconds,
	})
	if err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
	var buf [6]byte
	_, _ = rand.Read(buf[:])
	sessionID := "sdk-steer-" + hex.EncodeToString(buf[:])
	opts := aiden.StartAskOptions{SessionID: sessionID}
	if strings.TrimSpace(*workflow) != "" {
		opts.EntityRefs = []aiden.EntityRef{{Name: *workflow, Type: "workflow"}}
	}
	ctx, cancel := context.WithTimeout(context.Background(), time.Duration(*timeoutSeconds)*time.Second)
	defer cancel()
	start, err := client.Aiden.StartAsk(ctx, *message, opts)
	if err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
	fmt.Printf("started session_id=%s trace_id=%s\n", start.SessionID, start.TraceID)
	follow, err := client.Aiden.StartAsk(ctx, *followUp, opts)
	if err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
	traceID := follow.TraceID
	if aiden.IsSteerResponse(follow.Raw) {
		fmt.Printf("steered into %s\n", traceID)
	} else {
		fmt.Printf("new or queued turn %s\n", traceID)
		if traceID == "" {
			traceID = start.TraceID
		}
	}
	if err := client.Aiden.SubscribeExecution(ctx, traceID, func(aiden.ExecutionEvent) error { return nil }); err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
	fmt.Printf("subscribe complete ok=true trace_id=%s\n", traceID)
}
