package cmd

import (
	"log"
	"os"
)

// checkRootAlias compares the first argument provided in the CLI with a list of
// subcmds and aliases. If no match is found, the first alias of rootCmd is added.
func checkRootAlias() {
	l := len(rootCmd.Aliases)
	if l == 0 {
		return
	}
	if l > 1 {
		log.Printf("rootCmd.Aliases should contain a single string. '%s' is used.\n", rootCmd.Aliases[0])
	}
	if len(os.Args) > 1 {
		for _, v := range append(nonRootSubCmds(), []string{"--help", "--version"}...) {
			if os.Args[1] == v {
				return
			}
		}
	}
	os.Args = append([]string{os.Args[0], rootCmd.Aliases[0]}, os.Args[1:]...)
}

// nonRootSubCmds traverses the list of subcommands of rootCmd and returns a string
// slice containing the names and aliases of all the subcmds, except the one defined
// in the Aliases field of rootCmd.
func nonRootSubCmds() (l []string) {
	for _, c := range rootCmd.Commands() {
		isAlias := false
		for _, a := range append(c.Aliases, c.Name()) {
			if a == rootCmd.Aliases[0] {
				isAlias = true
				break
			}
		}
		if !isAlias {
			l = append(l, c.Name())
			l = append(l, c.Aliases...)
		}
	}
	return
}