// Pull fresh SRE alerts, then list the active inbox.
//
// Documented at https://appcd-dev.github.io/stackgen-sdk/code-samples/sre-pull-alerts/
//
//	go run ./examples/go/sre/pull-alerts.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", "", "Mothership URL")
	apiToken := flag.String("api-token", "", "API token")
	orgID := flag.String("workspace-id", "", "Workspace UUID (sent as orgId)")
	flag.StringVar(orgID, "org-id", *orgID, "Deprecated: use -workspace-id")
	source := flag.String("source", "grafana", "Alert source")
	integration := flag.String("integration", "", "Integration instance name")
	noWait := flag.Bool("no-wait", false, "Start the pull and exit without waiting")
	timeoutSeconds := flag.Int("timeout-seconds", 1800, "Wait timeout")
	pollInterval := flag.Int("poll-interval-seconds", 5, "Poll interval")
	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()
	integ := strings.TrimSpace(*integration)

	if *noWait {
		started, err := client.SRE.PullAlerts(ctx, *source, integ)
		if err != nil {
			fmt.Fprintln(os.Stderr, "error:", err)
			os.Exit(1)
		}
		raw, _ := json.MarshalIndent(started, "", "  ")
		fmt.Println("pull:", string(raw))
		return
	}

	finished, err := client.SRE.PullAlertsAndWait(ctx, *source, integ)
	if err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
	raw, _ := json.MarshalIndent(finished, "", "  ")
	fmt.Println("pull:", string(raw))
	alerts, err := client.SRE.ListAlerts(ctx, map[string]string{"status": "active", "page_size": "10"})
	if err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
	raw, _ = json.MarshalIndent(alerts, "", "  ")
	fmt.Println("alerts:", string(raw))
}
