package internal

import (
	"fmt"
	"os"

	"coopcloud.tech/abra/cli/formatter"
	"coopcloud.tech/abra/pkg/client"
	"coopcloud.tech/abra/pkg/config"
	"coopcloud.tech/abra/pkg/container"
	"github.com/docker/docker/api/types"
	"github.com/docker/docker/api/types/filters"
	"github.com/docker/docker/pkg/archive"
	"github.com/sirupsen/logrus"
	"github.com/urfave/cli/v2"
)

func ConfigureAndCp(c *cli.Context, app config.App, srcPath string, dstPath string, service string, isToContainer bool) error {
	appFiles, err := config.LoadAppFiles("")
	if err != nil {
		logrus.Fatal(err)
	}

	appEnv, err := config.GetApp(appFiles, app.Name)
	if err != nil {
		logrus.Fatal(err)
	}

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

	filters := filters.NewArgs()
	filters.Add("name", fmt.Sprintf("%s_%s", appEnv.StackName(), service))

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

	logrus.Debugf("retrieved %s as target container on %s", formatter.ShortenID(container.ID), app.Server)

	if isToContainer {
		if _, err := os.Stat(srcPath); err != nil {
			logrus.Fatalf("%s does not exist?", srcPath)
		}

		toTarOpts := &archive.TarOptions{NoOverwriteDirNonDir: true, Compression: archive.Gzip}
		content, err := archive.TarWithOptions(srcPath, toTarOpts)
		if err != nil {
			logrus.Fatal(err)
		}

		copyOpts := types.CopyToContainerOptions{AllowOverwriteDirWithFile: false, CopyUIDGID: false}
		if err := cl.CopyToContainer(c.Context, container.ID, dstPath, content, copyOpts); err != nil {
			logrus.Fatal(err)
		}
	} else {
		content, _, err := cl.CopyFromContainer(c.Context, container.ID, srcPath)
		if err != nil {
			logrus.Fatal(err)
		}
		defer content.Close()
		fromTarOpts := &archive.TarOptions{NoOverwriteDirNonDir: true, Compression: archive.Gzip}
		if err := archive.Untar(content, dstPath, fromTarOpts); err != nil {
			logrus.Fatal(err)
		}
	}
	return nil
}