package cmd

import (
	"github.com/kataras/my-iris-app/api"

	"github.com/spf13/cobra"
)

const defaultConfigFilename = "server.dev.yml"

var (
	serverConfig api.Configuration
)

// New returns a new root command.
// Usage:
// $ my-iris-app --config=server.yml
func New() *cobra.Command {
	configFile := defaultConfigFilename

	rootCmd := &cobra.Command{
		Use:                        "my-iris-app",
		Short:                      "My Command Line App",
		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 {
			return serverConfig.BindFile(configFile)
		},
		RunE: func(cmd *cobra.Command, args []string) error {
			return startServer()
		},
	}

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

	// Subcommands here.

	return rootCmd
}

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