// Ask start, then poll until the execution settles.
//
// Documented at https://appcd-dev.github.io/stackgen-sdk/code-samples/ask-execution/
//
//	go run ./examples/go/ask/ask-wait-session.go \
//	  --message 'Run triage for checkout CPU alert' \
//	  --workflow incident-triage
package main

import (
	"context"
	"encoding/json"
	"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")
	apiToken := flag.String("api-token", envOr("STACKGEN_TOKEN"), "API token")
	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", "", "Ask message")
	workflow := flag.String("workflow", "", "Workflow name for entity_refs")
	timeoutSeconds := flag.Int("timeout-seconds", 1800, "Overall timeout")
	pollInterval := flag.Int("poll-interval-seconds", 5, "Poll interval")
	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(*workflow) == "" {
		fmt.Fprintln(os.Stderr, "--message and --workflow are required")
		os.Exit(2)
	}
	client, err := stackgen.NewClient(stackgen.Config{
		BaseURL:             *baseURL,
		APIToken:            *apiToken,
		WorkspaceID:         *orgID,
		TimeoutSeconds:      *timeoutSeconds,
		PollIntervalSeconds: *pollInterval,
	})
	if err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
	ctx := context.Background()
	started, err := client.Aiden.StartAsk(ctx, *message, aiden.StartAskOptions{
		EntityRefs: []aiden.EntityRef{{Name: *workflow, Type: "workflow"}},
	})
	if err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
	raw, _ := json.MarshalIndent(started.Raw, "", "  ")
	fmt.Println("start:", string(raw))
	trace, err := client.Aiden.WaitForExecution(ctx, started.TraceID)
	if err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
	execution, _ := trace["execution"].(map[string]any)
	sessionID := started.SessionID
	if sessionID == "" {
		if v, ok := trace["session_id"].(string); ok {
			sessionID = v
		}
	}
	fmt.Fprintf(os.Stderr, "settled status=%v trace_settled=%v session_id=%s\n", execution["status"], execution["trace_settled"], sessionID)
}
