// -*- go -*-
////////////////////////////////////////////////////////////////////////////
// Program: {{.Name}}
// Purpose: {{.Desc}}
////////////////////////////////////////////////////////////////////////////

package {{$.PackageName}}

import (
	"github.com/mkideal/cli"
)

////////////////////////////////////////////////////////////////////////////
// {{.Name}}

type rootT struct {
	cli.Helper{{range .Options}}
	{{.Name}}	{{.Type}}	`cli:"{{.Flag}}" usage:"{{.Usage}}"{{if eq .Name "Self" }} json:"-" parser:"jsonfile"{{end}}{{if .Value}} dft:"{{.Value}}"{{end}}`{{end}}
}

var root = &cli.Command{
	Name: "{{.Name}}",
	Desc: "{{.Desc}}",
{{if .Text}}	Text: "{{.Text}}",
{{end}}{{if .Global}}	Global: {{.Global}},
{{end}}{{if .Self}}	Argv: func() interface{} {  t := new(rootT); t.Self = t; return t },
{{else}}	Argv: func() interface{} { return new(rootT) },
{{end}}	Fn:   {{.Name}},
{{if .NumOption}}
	NumOption:      {{.NumOption}},
{{end}}{{if .NumArg}}
	NumArg:      {{.NumArg}},
{{end}}{{if .CanSubRoute}}
	CanSubRoute:      {{.CanSubRoute}},
{{end}}}


// func main() {
// 	cli.SetUsageStyle(cli.ManualStyle) // up-down, for left-right, use NormalStyle
// 	//NOTE: You can set any writer implements io.Writer
// 	// default writer is os.Stdout
// 	if err := cli.Root(root,{{range $i, $cmd := .Command}}
// 		cli.Tree({{$cmd.Name}}Def){{if lt $i ($.Command | len | minus1)}},{{end}}{{end}}).Run(os.Args[1:]); err != nil {
// 		fmt.Fprintln(os.Stderr, err)
// 	}
// 	fmt.Println("")
// }

// func {{.Name}}(ctx *cli.Context) error {
// 	ctx.JSON(ctx.RootArgv())
// 	ctx.JSON(ctx.Argv())
// 	fmt.Println()

// 	return nil
// }

{{range .Command}}
////////////////////////////////////////////////////////////////////////////
// {{.Name}}

// func {{.Name}}CLI(ctx *cli.Context) error {
// 	rootArgv := ctx.RootArgv().(*rootT)
// 	argv := ctx.Argv().(*{{.Name}}T)
// 	fmt.Printf("[{{.Name}}]:\n  %+v\n  %+v\n  %v\n", rootArgv, argv, ctx.Args())
// 	return nil
// }

type {{.Name}}T struct {
{{range .Options}}
	{{.Name}}	{{.Type}}	`cli:"{{.Flag}}" usage:"{{.Usage}}"{{if eq .Name "Self" }} json:"-" parser:"jsonfile"{{end}}{{if .Value}} dft:"{{.Value}}"{{end}}`{{end}}
}

var {{.Name}}Def = &cli.Command{
	Name: "{{.Name}}",
	Desc: "{{.Desc}}",
{{if .Text}}	Text: "{{.Text}}",
{{end}}{{if .Self}}	Argv: func() interface{} {  t := new({{.Name}}T); t.Self = t; return t },
{{else}}	Argv: func() interface{} { return new({{.Name}}T) },
{{end}}	Fn:   {{.Name}}CLI,
{{if .NumOption}}
	NumOption:      {{.NumOption}},
{{end}}{{if .NumArg}}
	NumArg:      {{.NumArg}},
	CanSubRoute: true,
{{end}}{{if .CanSubRoute}}
	CanSubRoute:      {{.CanSubRoute}},
{{end}}}
{{end}}
