// Package urfavecli contains utility functions for working with https://github.com/urfave/cli.
package urfavecli

import (
	cli "github.com/urfave/cli/v2"
	"go.skia.org/infra/go/sklog"
)

// LogFlags reflects all the flags and their values as Info logs.
//
// Should be called from within the Action of a Command after logging is setup.
//
// Example
//
//	&cli.Command{
//	    Name:        "my-command",
//	    Action: func(c *cli.Context) error {
//	        urfavecli.LogFlags(c)
//	        // Do command stuff.
//	    },
//	},
func LogFlags(cliContext *cli.Context) {
	for _, flag := range cliContext.App.Flags {
		name := flag.Names()[0]
		sklog.Infof("App Flags: --%s=%v", name, cliContext.Value(name))
	}
	for _, flag := range cliContext.Command.Flags {
		name := flag.Names()[0]
		sklog.Infof("Command Flags: --%s=%v", name, cliContext.Value(name))
	}
}

// MarkdownDocTemplate is a common template used to format commands as Markdown.
const MarkdownDocTemplate = `# NAME

{{ .App.Name }}{{ if .App.Usage }} - {{ .App.Usage }}{{ end }}

# SYNOPSIS

{{ .App.Name }}
{{ if .SynopsisArgs }}
` + "```" + `
{{ range $v := .SynopsisArgs }}{{ $v }}{{ end }}` + "```" + `
{{ end }}{{ if .App.UsageText }}
# DESCRIPTION

{{ .App.UsageText }}
{{ end }}
**Usage**:

` + "```" + `
{{ .App.Name }} [GLOBAL OPTIONS] command [COMMAND OPTIONS] [ARGUMENTS...]
` + "```" + `
{{ if .GlobalArgs }}
# GLOBAL OPTIONS
{{ range $v := .GlobalArgs }}
{{ $v }}{{ end }}
{{ end }}{{ if .Commands }}
# COMMANDS
{{ range $v := .Commands }}
{{ $v }}{{ end }}{{ end }}`
