// Ask start, wait, and download a session artifact.
//
// Documented at https://appcd-dev.github.io/stackgen-sdk/code-samples/ask-artifact/
//
//	go run ./examples/go/ask/ask-download-report.go \
//	  --message 'Run triage for checkout CPU alert' \
//	  --workflow-name incident-triage
package main

import (
	"context"
	"flag"
	"fmt"
	"os"
	"strings"

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

func envOr(keys ...string) string {
	for _, key := range keys {
		if v := strings.TrimSpace(os.Getenv(key)); v != "" {
			return v
		}
	}
	return ""
}

func main() {
	baseURL := flag.String("base-url", envOr("STACKGEN_URL"), "Mothership URL (no /guild suffix)")
	apiToken := flag.String("api-token", envOr("STACKGEN_TOKEN"), "API token (stackgen_…)")
	orgID := flag.String("workspace-id", envOr("STACKGEN_WORKSPACE_ID", "STACKGEN_PROJECT", "STACKGEN_PROJECT_ID"), "Workspace UUID (sent as orgId)")
	flag.StringVar(orgID, "org-id", *orgID, "Deprecated: use -workspace-id")
	message := flag.String("message", "", "Natural-language task for Ask")
	workflowName := flag.String("workflow-name", "", "Workflow name to pin via entity_refs")
	timeoutSeconds := flag.Int("timeout-seconds", 1800, "Overall timeout")
	artifactName := flag.String("artifact-name", "session-report.md", "Session artifact filename")
	outputPath := flag.String("output-path", "session-report.md", "Local path to write the artifact")
	flag.Parse()
	if *baseURL == "" || *apiToken == "" || *orgID == "" {
		fmt.Fprintln(os.Stderr, "set --base-url/--api-token/--workspace-id or STACKGEN_URL/STACKGEN_TOKEN/STACKGEN_WORKSPACE_ID")
		os.Exit(2)
	}
	if strings.TrimSpace(*message) == "" || strings.TrimSpace(*workflowName) == "" {
		fmt.Fprintln(os.Stderr, "--message and --workflow-name are required")
		os.Exit(2)
	}
	client, err := stackgen.NewClient(stackgen.Config{
		BaseURL:        *baseURL,
		APIToken:       *apiToken,
		WorkspaceID:    *orgID,
		ArtifactName:   *artifactName,
		OutputPath:     *outputPath,
		TimeoutSeconds: *timeoutSeconds,
	})
	if err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
	result, err := client.Aiden.RunAskAndDownloadArtifact(context.Background(), *message, aiden.StartAskOptions{
		EntityRefs: []aiden.EntityRef{{Name: *workflowName, Type: "workflow"}},
	}, *artifactName, *outputPath)
	if err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
	fmt.Fprintf(os.Stderr, "trace_id=%s session_id=%s output=%s\n", result.TraceID, result.SessionID, result.OutputPath)
}
