package main

import (
	"fmt"
	"os"
	"os/exec"
	"strings"
	"time"

	"github.com/docker/docker/client"
)

func system(commands [][]string) error {
	for _, c := range commands {
		cmd := exec.Command(c[0], c[1:]...)
		cmd.Stdout = os.Stdout
		cmd.Stderr = os.Stderr
		cmd.Env = os.Environ()
		if err := cmd.Run(); err != nil {
			return err
		}
	}
	return nil
}

func pushImage(unusedCli *client.Client, remote, local string) error {
	// FIXME: eliminate os/exec (but it is hard to pass auth without os/exec ...)
	return system([][]string{
		{"docker", "image", "tag", local, remote},
		{"docker", "image", "push", remote},
	})
}

func deployStack(unusedCli *client.Client, stackName, composeFilePath string) error {
	// FIXME: eliminate os/exec (but stack is implemented in CLI ...)
	return system([][]string{
		{"docker", "stack", "deploy",
			"--compose-file", composeFilePath,
			"--with-registry-auth",
			"--resolve-image", "never",
			stackName},
	})
}

func hasStack(unusedCli *client.Client, stackName string) bool {
	// FIXME: eliminate os/exec (but stack is implemented in CLI ...)
	out, err := exec.Command("docker", "stack", "ls").Output()
	if err != nil {
		panic(fmt.Errorf("`docker stack ls` failed with: %s", string(out)))
	}
	// FIXME: not accurate
	return strings.Contains(string(out), stackName)
}

func removeStack(unusedCli *client.Client, stackName string) error {
	// FIXME: eliminate os/exec (but stack is implemented in CLI ...)
	if err := system([][]string{
		{"docker", "stack", "rm", stackName},
	}); err != nil {
		return err
	}
	// FIXME
	time.Sleep(10 * time.Second)
	return nil
}
