// Start workflow discovery and wait until ready.
//
//	go run ./examples/go/devops/discover-workflows.go --no-wait
package main

import (
	"context"
	"encoding/json"
	"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", "", "")
	apiToken := flag.String("api-token", "", "")
	orgID := flag.String("workspace-id", "", "Workspace UUID (sent as orgId)")
	flag.StringVar(orgID, "org-id", *orgID, "Deprecated: use -workspace-id")
	noWait := flag.Bool("no-wait", false, "")
	timeoutSeconds := flag.Int("timeout-seconds", 1800, "")
	pollInterval := flag.Int("poll-interval-seconds", 5, "")
	flag.Parse()

	base := strings.TrimSpace(*baseURL)
	if base == "" {
		base = envOr("STACKGEN_URL")
	}
	token := strings.TrimSpace(*apiToken)
	if token == "" {
		token = envOr("STACKGEN_TOKEN")
	}
	org := strings.TrimSpace(*orgID)
	if org == "" {
		org = envOr("STACKGEN_WORKSPACE_ID", "STACKGEN_ORG_ID", "STACKGEN_PROJECT", "STACKGEN_PROJECT_ID")
	}
	if base == "" || token == "" {
		fmt.Fprintln(os.Stderr, "set STACKGEN_URL and STACKGEN_TOKEN")
		os.Exit(2)
	}
	client, err := stackgen.NewClient(stackgen.Config{
		BaseURL: base, APIToken: token, WorkspaceID: org,
		TimeoutSeconds: *timeoutSeconds, PollIntervalSeconds: *pollInterval,
	})
	if err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
	ctx := context.Background()
	if *noWait {
		latest, err := client.DevOps.LatestWorkflowDiscovery(ctx)
		if err != nil {
			fmt.Fprintln(os.Stderr, "error:", err)
			os.Exit(1)
		}
		raw, _ := json.MarshalIndent(latest, "", "  ")
		fmt.Println("latest:", string(raw))
		return
	}
	started, err := client.DevOps.StartWorkflowDiscovery(ctx, nil)
	if err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
	raw, _ := json.MarshalIndent(started, "", "  ")
	fmt.Println("started:", string(raw))
	ready, err := client.DevOps.WaitForWorkflowDiscovery(ctx)
	if err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
	raw, _ = json.MarshalIndent(ready, "", "  ")
	fmt.Println("ready:", string(raw))
}
