package app

import (
	"fmt"

	"coopcloud.tech/abra/cli/internal"
	"coopcloud.tech/abra/pkg/client"
	stack "coopcloud.tech/abra/pkg/client/stack"
	"coopcloud.tech/abra/pkg/config"
	"github.com/sirupsen/logrus"
	"github.com/urfave/cli/v2"
)

var appDeployCommand = &cli.Command{
	Name:    "deploy",
	Aliases: []string{"d"},
	Usage:   "Deploy an app",
	Action: func(c *cli.Context) error {
		app := internal.ValidateApp(c)

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

		abraShPath := fmt.Sprintf("%s/%s/%s", config.APPS_DIR, app.Type, "abra.sh")
		abraShEnv, err := config.ReadAbraShEnvVars(abraShPath)
		if err != nil {
			logrus.Fatal(err)
		}
		for k, v := range abraShEnv {
			app.Env[k] = v
		}
		app.Env["STACK_NAME"] = app.StackName()

		composeFiles, err := config.GetAppComposeFiles(app.Type, app.Env)
		if err != nil {
			logrus.Fatal(err)
		}
		deployOpts := stack.Deploy{
			Composefiles: composeFiles,
			Namespace:    app.StackName(),
			Prune:        false,
			ResolveImage: stack.ResolveImageAlways,
		}
		compose, err := config.GetAppComposeConfig(app.Name, deployOpts, app.Env)
		if err != nil {
			logrus.Fatal(err)
		}

		if err := stack.RunDeploy(cl, deployOpts, compose); err != nil {
			logrus.Fatal(err)
		}

		return nil
	},
	BashComplete: func(c *cli.Context) {
		appNames, err := config.GetAppNames()
		if err != nil {
			logrus.Warn(err)
		}
		if c.NArg() > 0 {
			return
		}
		for _, a := range appNames {
			fmt.Println(a)
		}
	},
}