package app

import (
	"errors"
	"fmt"
	"time"

	"coopcloud.tech/abra/cli/internal"
	"coopcloud.tech/abra/pkg/autocomplete"
	"coopcloud.tech/abra/pkg/client"
	containerPkg "coopcloud.tech/abra/pkg/container"
	"github.com/docker/docker/api/types/filters"
	"github.com/sirupsen/logrus"
	"github.com/urfave/cli/v2"
)

var appRestartCommand = &cli.Command{
	Name:        "restart",
	Usage:       "Restart an app",
	Aliases:     []string{"R"},
	ArgsUsage:   "<service>",
	Description: `This command restarts a service within a deployed app.`,
	Action: func(c *cli.Context) error {
		app := internal.ValidateApp(c)

		serviceName := c.Args().Get(1)
		if serviceName == "" {
			err := errors.New("missing service?")
			internal.ShowSubcommandHelpAndError(c, err)
		}

		cl, err := client.New(app.Server)
		if err != nil {
			logrus.Fatal(err)
		}

		serviceFilter := fmt.Sprintf("%s_%s", app.StackName(), serviceName)
		filters := filters.NewArgs()
		filters.Add("name", serviceFilter)

		targetContainer, err := containerPkg.GetContainer(c.Context, cl, filters, true)
		if err != nil {
			logrus.Fatal(err)
		}

		logrus.Debugf("attempting to restart %s", serviceFilter)

		timeout := 30 * time.Second
		if err := cl.ContainerRestart(c.Context, targetContainer.ID, &timeout); err != nil {
			logrus.Fatal(err)
		}

		logrus.Infof("%s service restarted", serviceFilter)

		return nil
	},
	BashComplete: autocomplete.AppNameComplete,
}