package hooks

import (
	"fmt"
)

const (
	hookTemplateCommandName = `{{command}}`
	hookTemplateFlagValue   = `{{flagValue %q}}`
	hookTemplateArg         = `{{argValue %d}}`
)

// TemplateReplaceSubcommandName returns a hook template string
// that will be replaced by the CLI subcommand being executed
//
// Example:
//
//	Response{
//		Type:     NextSteps,
//		Template: "you ran the subcommand: " + TemplateReplaceSubcommandName(),
//	}
//
// When being executed after the command:
//
//	docker run --name "my-container" alpine
//
// It results in the message:
//
//	you ran the subcommand: run
func TemplateReplaceSubcommandName() string {
	return hookTemplateCommandName
}

// TemplateReplaceFlagValue returns a hook template string that will be
// replaced with the flags value when printed by the CLI.
//
// Example:
//
//	Response{
//		Type:     NextSteps,
//		Template: "you ran a container named: " + TemplateReplaceFlagValue("name"),
//	}
//
// when executed after the command:
//
//	docker run --name "my-container" alpine
//
// it results in the message:
//
//	you ran a container named: my-container
func TemplateReplaceFlagValue(flag string) string {
	return fmt.Sprintf(hookTemplateFlagValue, flag)
}

// TemplateReplaceArg takes an index i and returns a hook
// template string that the CLI will replace the template with
// the ith argument after processing the passed flags.
//
// Example:
//
//	Response{
//		Type:     NextSteps,
//		Template: "run this image with `docker run " + TemplateReplaceArg(0) + "`",
//	}
//
// when being executed after the command:
//
//	docker pull alpine
//
// It results in the message:
//
//	Run this image with `docker run alpine`
func TemplateReplaceArg(i int) string {
	return fmt.Sprintf(hookTemplateArg, i)
}
