// Download an execution debug ZIP by trace id.
//
// Documented at https://appcd-dev.github.io/stackgen-sdk/code-samples/ask-debug-zip/
//
//	go run ./examples/go/ask/download-debug-zip.go --trace-id <trace-id>
package main

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

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

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_ORG_ID"), "Workspace UUID (sent as orgId)")
	flag.StringVar(orgID, "org-id", *orgID, "Deprecated: use -workspace-id")
	traceID := flag.String("trace-id", "", "Execution trace id")
	outputPath := flag.String("output-path", "", "Local ZIP path")
	flag.Parse()
	if *baseURL == "" || *apiToken == "" || *orgID == "" {
		fmt.Fprintln(os.Stderr, "set STACKGEN_URL / STACKGEN_TOKEN / STACKGEN_WORKSPACE_ID (or flags)")
		os.Exit(2)
	}
	if strings.TrimSpace(*traceID) == "" {
		fmt.Fprintln(os.Stderr, "--trace-id is required")
		os.Exit(2)
	}
	out := strings.TrimSpace(*outputPath)
	if out == "" {
		prefix := *traceID
		if len(prefix) > 16 {
			prefix = prefix[:16]
		}
		out = "execution-" + prefix + "-debug.zip"
	}
	client, err := stackgen.NewClient(stackgen.Config{BaseURL: *baseURL, APIToken: *apiToken, WorkspaceID: *orgID})
	if err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
	path, err := client.Aiden.DownloadExecutionDebugZip(context.Background(), *traceID, out)
	if err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
	info, err := os.Stat(path)
	if err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
	fmt.Printf("trace_id=%s output=%s bytes=%d\n", *traceID, path, info.Size())
}
