// Probe a registered model with TestModel, optionally retiring it afterward.
//
// TestModel runs a small generation call against the provider without
// writing anything, so it is the right pre-flight check before wiring an
// agent to a model, or after rotating a provider's token_reference.
//
//	export STACKGEN_URL=https://app.stackgen.com
//	export STACKGEN_TOKEN=stackgen_…
//	export STACKGEN_WORKSPACE_ID=<workspace-uuid>
//	go run ./examples/go/models/test-model.go \
//	  -provider-name my-openai -model-id gpt-4o-mini
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"
)

// 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() {
	providerName := flag.String("provider-name", "", "existing model provider name")
	modelID := flag.String("model-id", "", "provider-specific model id to probe")
	modelName := flag.String("model-name", "", "registered model name; required with -delete-after-test")
	deleteAfterTest := flag.Bool("delete-after-test", false, "delete the model and provider after a successful probe")
	flag.Parse()
	if strings.TrimSpace(*providerName) == "" || strings.TrimSpace(*modelID) == "" {
		fmt.Fprintln(os.Stderr, "-provider-name and -model-id are required")
		os.Exit(2)
	}
	if *deleteAfterTest && strings.TrimSpace(*modelName) == "" {
		fmt.Fprintln(os.Stderr, "-model-name is required with -delete-after-test")
		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)
	}
	ctx := context.Background()

	result, err := client.Aiden.TestModel(ctx, aiden.TestModelRequest{
		ProviderName: *providerName,
		ModelID:      *modelID,
		MaxTokens:    16,
	})
	if err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
	fmt.Printf("testModel success=%v message=%s\n", result.Success, result.Message)

	if !*deleteAfterTest {
		return
	}
	if err := client.Aiden.DeleteModel(ctx, *modelName); err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
	fmt.Printf("deleted model name=%s\n", *modelName)
	if err := client.Aiden.DeleteLLMProvider(ctx, *providerName); err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
	fmt.Printf("deleted provider name=%s\n", *providerName)
}
