package commands

import (
	"os"
	"os/exec"

	"github.com/contiamo/dev/cli/config"
	"github.com/spf13/cobra"
)

func init() {
	serviceFlags(restartCmd.Flags())
	restartCmd.Flags().BoolP("clean", "c", false, "remove data volumes to clear the localdev db")
}

var restartCmd = &cobra.Command{
	Use:   "restart",
	Short: "restart a single service or the whole dev environment",
	Example: `
localdev restart
localdev restart hub
localdev restart hub ui
localdev restart --clean`,
	ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
		services, err := listServices(cmd, false)
		if err != nil {
			return nil, cobra.ShellCompDirectiveError | cobra.ShellCompDirectiveNoFileComp
		}

		return services, cobra.ShellCompDirectiveNoSpace | cobra.ShellCompDirectiveNoFileComp
	},
	RunE: func(cmd *cobra.Command, args []string) (err error) {
		clean, err := cmd.Flags().GetBool("clean")
		if err != nil {
			return err
		}

		withIngester := config.WithIngester()
		withPantheonRedir := config.WithPantheonRedir()
		env := os.Environ()

		if clean {
			err = stopLocaldev(cmd, clean)
		} else {
			err = stopServices(cmd, withIngester, withPantheonRedir, env, args)
		}
		if err != nil {
			return err
		}

		composeFiles := []string{"-f", "docker-compose.yml"}
		if withIngester {
			composeFiles = append(composeFiles, "-f", "docker-compose-extra.yml")
		}
		if withPantheonRedir {
			env = append(env, "PANTHEON_IMAGE="+config.PantheonRedirImage())
		}

		startArgs := append(composeFiles, "up", "-d")
		startArgs = append(startArgs, args...)

		start := exec.CommandContext(
			cmd.Context(),
			"docker-compose",
			startArgs...,
		)
		start.Dir = config.LocaldevRoot()
		start.Stderr = cmd.OutOrStderr()
		start.Stdout = cmd.OutOrStdout()
		start.Env = env

		err = start.Run()
		if err != nil {
			return err
		}

		return printStartMessage(cmd.OutOrStdout())
	},
}
