// Publish a hello workflow from Go.
//
// Documented at https://appcd-dev.github.io/stackgen-sdk/code-samples/create-workflow/
//
//	go run ./examples/go/create-workflow/create-hello-workflow.go
package main

import (
	"context"
	"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() {
	baseURL := flag.String("base-url", envOr("STACKGEN_URL"), "Mothership URL")
	apiToken := flag.String("api-token", envOr("STACKGEN_TOKEN"), "API token")
	orgID := flag.String("workspace-id", envOr("STACKGEN_WORKSPACE_ID", "STACKGEN_PROJECT"), "Workspace UUID (sent as orgId)")
	flag.StringVar(orgID, "org-id", *orgID, "Deprecated: use -workspace-id")
	agentName := flag.String("agent-name", "hello-agent", "Agent name")
	workflowName := flag.String("workflow-name", "hello-workflow", "Workflow name")
	flag.Parse()
	if *baseURL == "" || *apiToken == "" {
		fmt.Fprintln(os.Stderr, "Need --base-url and --api-token (or STACKGEN_URL / STACKGEN_TOKEN)")
		os.Exit(1)
	}
	client, err := stackgen.NewClient(stackgen.Config{BaseURL: *baseURL, APIToken: *apiToken, WorkspaceID: *orgID})
	if err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
	agent, err := aiden.CreateAgent(*agentName, "You turn a short topic into a clear three-bullet summary.\nStay concrete. Do not invent sources.", aiden.AgentOptions{
		AlwaysAllowedTools: []string{"note"},
		AutoApproveTools:   []map[string]string{{"tool": "note"}},
	})
	if err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
	stage, err := aiden.CreateStage("summarize", *agentName, aiden.StageOptions{
		Description: "Summarize the topic in three bullets.",
		Note:        "Read the workflow required input `topic`.\nReply with exactly three bullets, then stop.",
	})
	if err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
	workflow, err := aiden.CreateWorkflow(*workflowName, "product", aiden.WorkflowOptions{
		RequiredInputs: []string{"topic"},
		Tags:           []string{"example"},
	}).Then(stage).Commit()
	if err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
	published, err := client.Aiden.PublishWorkflow(context.Background(), workflow, aiden.PublishOptions{
		Agents:  []aiden.AgentDefinition{agent},
		Approve: true,
	})
	if err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
	fmt.Printf("published %s v%d (%s)\n", published.WorkflowName, published.Version, published.Status)
	fmt.Printf("run with: stackgen ai run workflow/%s --input 'topic=…'\n", *workflowName)
}
