package stack

import (
	"fmt"
	"sort"
	"strings"
	"testing"

	"github.com/docker/cli/internal/test/environment"
	"gotest.tools/v3/assert"
	"gotest.tools/v3/golden"
	"gotest.tools/v3/icmd"
	"gotest.tools/v3/skip"
)

func TestDeployWithNamedResources(t *testing.T) {
	t.Run("Swarm", func(t *testing.T) {
		testDeployWithNamedResources(t, "swarm")
	})
	t.Run("Kubernetes", func(t *testing.T) {
		// FIXME(chris-crone): currently does not work with compose for kubernetes.
		t.Skip("FIXME(chris-crone): currently does not work with compose for kubernetes.")
		skip.If(t, !environment.KubernetesEnabled())

		testDeployWithNamedResources(t, "kubernetes")
	})
}

func testDeployWithNamedResources(t *testing.T, orchestrator string) {
	stackname := fmt.Sprintf("test-stack-deploy-with-names-%s", orchestrator)
	composefile := golden.Path("stack-with-named-resources.yml")

	result := icmd.RunCommand("docker", "stack", "deploy",
		"-c", composefile, stackname, "--orchestrator", orchestrator)
	defer icmd.RunCommand("docker", "stack", "rm",
		"--orchestrator", orchestrator, stackname)

	result.Assert(t, icmd.Success)
	stdout := strings.Split(result.Stdout(), "\n")
	expected := strings.Split(string(golden.Get(t, fmt.Sprintf("stack-deploy-with-names-%s.golden", orchestrator))), "\n")
	sort.Strings(stdout)
	sort.Strings(expected)
	assert.DeepEqual(t, stdout, expected)
}
