package cmd

import (
	"github.com/username/project/api"

	"github.com/kataras/iris/v12"
	"github.com/spf13/cobra"
)

const defaultConfigFilename = "server.yml"

var serverConfig api.Configuration

// New returns a new CLI app.
// Build with:
// $ go build -ldflags="-s -w"
func New() *cobra.Command {
	configFile := defaultConfigFilename

	rootCmd := &cobra.Command{
		Use:                        "project",
		Short:                      "Command line interface for project.",
		Long:                       "The root command will start the HTTP server.",
		Version:                    "v0.0.1",
		SilenceErrors:              true,
		SilenceUsage:               true,
		TraverseChildren:           true,
		SuggestionsMinimumDistance: 1,
		PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
			// Read configuration from file before any of the commands run functions.
			return serverConfig.BindFile(configFile)
		},
		RunE: func(cmd *cobra.Command, args []string) error {
			return startServer()
		},
	}

	helpTemplate := HelpTemplate{
		BuildRevision:        iris.BuildRevision,
		BuildTime:            iris.BuildTime,
		ShowGoRuntimeVersion: true,
	}
	rootCmd.SetHelpTemplate(helpTemplate.String())

	// Shared flags.
	flags := rootCmd.PersistentFlags()
	flags.StringVar(&configFile, "config", configFile, "--config=server.yml a filepath which contains the YAML config format")

	// Subcommands here.
	// rootCmd.AddCommand(...)

	return rootCmd
}

func startServer() error {
	srv := api.NewServer(serverConfig)
	return srv.Start()
}