// Create a chat subscription, mute it, then delete it.
//
// Documented at https://appcd-dev.github.io/stackgen-sdk/code-samples/chat-subscriptions/
//
//	go run ./examples/go/automation/chat-subscriptions.go --app-name sre
//	go run ./examples/go/automation/chat-subscriptions.go --target-type agent --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() {
	appName := flag.String("app-name", "", "Installed catalog app name")
	targetType := flag.String("target-type", "app", "app or agent")
	agent := flag.String("agent", "", "Agent name when --target-type is agent")
	channelID := flag.String("channel-id", "", "Optional channel id")
	flag.Parse()
	if *targetType != "app" && *targetType != "agent" {
		fmt.Fprintln(os.Stderr, "--target-type must be app or agent")
		os.Exit(2)
	}
	targetName := *appName
	if *targetType == "agent" {
		if strings.TrimSpace(*agent) == "" {
			fmt.Fprintln(os.Stderr, "--agent is required when --target-type agent")
			os.Exit(2)
		}
		targetName = *agent
	} else if strings.TrimSpace(*appName) == "" {
		fmt.Fprintln(os.Stderr, "--app-name is required when --target-type app")
		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)
	}
	client, err := stackgen.NewClient(stackgen.Config{BaseURL: base, APIToken: token, WorkspaceID: org})
	if err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
	body := map[string]any{
		"name":          "checkout-sev-mentions",
		"app_name":      targetName,
		"target_type":   *targetType,
		"target_name":   targetName,
		"trigger_types": []string{"mention"},
		"enabled":       true,
	}
	if *channelID != "" {
		body["channel_selector"] = map[string]any{"channel_ids": []string{*channelID}}
	}
	ctx := context.Background()
	sub, err := client.Aiden.CreateChatSubscription(ctx, body)
	if err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
	id, _ := sub["id"].(string)
	fmt.Printf("created subscription id=%s\n", id)
	if _, err := client.Aiden.ToggleChatSubscription(ctx, id, map[string]any{"enabled": false}); err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
	fmt.Println("toggled enabled=false")
	if _, err := client.Aiden.DeleteChatSubscription(ctx, id); err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
	fmt.Println("deleted subscription")
}
