// Store an integration secret, register an agent, and optionally start Ask.
//
// Documented at https://appcd-dev.github.io/stackgen-sdk/code-samples/agent-vault-ask/
//
//	export GH_TOKEN=ghs_…
//	go run ./examples/go/automation/agent-vault-ask.go --ask
package main

import (
	"context"
	"crypto/rand"
	"encoding/hex"
	"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() {
	ask := flag.Bool("ask", false, "Also start Ask against the agent")
	mode := flag.String("mode", "simple", "Ask mode when --ask is set (simple or plan)")
	flag.Parse()
	if *mode != "simple" && *mode != "plan" {
		fmt.Fprintln(os.Stderr, "--mode must be simple or plan")
		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)
	}
	gh := envOr("GH_TOKEN", "GITHUB_TOKEN")
	if gh == "" {
		fmt.Fprintln(os.Stderr, "set GH_TOKEN or GITHUB_TOKEN")
		os.Exit(2)
	}
	var buf [4]byte
	_, _ = rand.Read(buf[:])
	suffix := hex.EncodeToString(buf[:])
	integrationName := "sdk-int-" + suffix
	agentName := "sdk-agent-" + suffix
	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()
	enabled := true
	result, err := client.UpsertIntegrationWithSecretsContext(ctx, stackgen.UpsertIntegrationWithSecretsOptions{
		Name:        integrationName,
		Type:        "github",
		Secrets:     map[string]string{"token": gh},
		Description: "GitHub for ops bot",
		Enabled:     &enabled,
	})
	if err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
	fmt.Printf("secret_ids=%v integration=%v\n", result.SecretIDs, result.Integration["name"])
	if _, err := client.Aiden.RegisterAgent(ctx, map[string]any{
		"name":         agentName,
		"persona":      "Help with GitHub tasks.",
		"integrations": []string{integrationName},
		"hitl":         map[string]any{"always_allowed": []string{"*"}},
	}); err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
	fmt.Printf("registered agent %s\n", agentName)
	if !*ask {
		return
	}
	started, err := client.Aiden.StartAsk(ctx, "Summarize open PRs", aiden.StartAskOptions{
		EntityRefs: []aiden.EntityRef{{Name: agentName, Type: "agent"}},
		Mode:       *mode,
	})
	if err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
	fmt.Printf("trace_id=%s session_id=%s\n", started.TraceID, started.SessionID)
}
