// Start Ask, follow the execution stream, then download every session artifact.
//
// Documented at https://appcd-dev.github.io/stackgen-sdk/code-samples/ask-session-artifacts/
//
//	go run ./examples/go/ask/ask-session-artifacts.go --agent my-ops-agent
package main

import (
	"context"
	"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", "Look at recent changes in our GitHub org. Leave me a short markdown note I can download.", "Ask message")
	agent := flag.String("agent", "", "Pin an agent via entity_refs")
	workflowName := flag.String("workflow-name", "", "Pin a workflow via entity_refs")
	outputDir := flag.String("output-dir", "session-artifacts", "Directory for downloaded artifacts")
	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)
	}
	var refs []aiden.EntityRef
	if strings.TrimSpace(*agent) != "" {
		refs = append(refs, aiden.EntityRef{Name: *agent, Type: "agent"})
	}
	if strings.TrimSpace(*workflowName) != "" {
		refs = append(refs, aiden.EntityRef{Name: *workflowName, Type: "workflow"})
	}
	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)
	}
	ctx, cancel := context.WithTimeout(context.Background(), time.Duration(*timeoutSeconds)*time.Second)
	defer cancel()
	started, err := client.Aiden.StartAsk(ctx, *message, aiden.StartAskOptions{EntityRefs: refs})
	if err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
	if err := client.Aiden.SubscribeExecution(ctx, started.TraceID, func(aiden.ExecutionEvent) error { return nil }); err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
	downloaded, err := client.Aiden.DownloadSessionArtifacts(ctx, started.SessionID, *outputDir)
	if err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
	for _, row := range downloaded {
		fmt.Println(row.Path)
	}
}
