// Create a webhook and an hourly schedule, trigger the schedule once, then delete both.
//
// Documented at https://appcd-dev.github.io/stackgen-sdk/code-samples/webhook-schedule-hitl/
//
//	go run ./examples/go/automation/webhook-schedule-hitl.go --agent my-oncall-agent
package main

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

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

// envOr returns the first non-empty environment variable among keys.
func envOr(keys ...string) string {
	for _, key := range keys {
		if v := strings.TrimSpace(os.Getenv(key)); v != "" {
			return v
		}
	}
	return ""
}

func main() {
	agent := flag.String("agent", "", "Existing agent name")
	workflow := flag.String("workflow", "", "Existing workflow name")
	flag.Parse()
	if (*agent == "") == (*workflow == "") {
		fmt.Fprintln(os.Stderr, "pass exactly one of --agent or --workflow")
		os.Exit(2)
	}
	base, token, org := envOr("STACKGEN_URL"), envOr("STACKGEN_TOKEN"), envOr("STACKGEN_WORKSPACE_ID", "STACKGEN_PROJECT")
	if base == "" || token == "" || org == "" {
		fmt.Fprintln(os.Stderr, "set STACKGEN_URL, STACKGEN_TOKEN, and STACKGEN_WORKSPACE_ID")
		os.Exit(2)
	}
	targetType, targetName := "agent", *agent
	if *workflow != "" {
		targetType, targetName = "workflow", *workflow
	}
	client, err := stackgen.NewClient(stackgen.Config{BaseURL: base, APIToken: token, WorkspaceID: org})
	if err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
	ctx := context.Background()
	wh, err := client.Aiden.CreateWebhook(ctx, map[string]any{
		"name":        "ops-pager",
		"target_type": targetType,
		"target_name": targetName,
		"action":      "Investigate the alert",
		"enabled":     true,
	})
	if err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
	webhookID, _ := wh["id"].(string)
	defer func() {
		if webhookID != "" {
			_, _ = client.Aiden.DeleteWebhook(context.Background(), webhookID)
		}
	}()
	sched, err := client.Aiden.CreateSchedule(ctx, map[string]any{
		"name":        "ops-hourly",
		"target_type": targetType,
		"target_name": targetName,
		"expression":  "0 * * * *",
		"action":      "Hourly health check",
		"enabled":     true,
	})
	if err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
	scheduleID, _ := sched["id"].(string)
	defer func() {
		if scheduleID != "" {
			_, _ = client.Aiden.DeleteSchedule(context.Background(), scheduleID)
		}
	}()
	if _, err := client.Aiden.TriggerSchedule(ctx, scheduleID); err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
	fmt.Printf("webhook=%s schedule=%s triggered\n", webhookID, scheduleID)
}
