package client_test

import (
	"testing"

	"coopcloud.tech/abra/pkg/client"
	dContext "github.com/docker/cli/cli/context"
	dCliContextStore "github.com/docker/cli/cli/context/store"
)

type TestContext struct {
	context           dCliContextStore.Metadata
	expected_endpoint string
}

func dockerContext(host, key string) TestContext {
	dockerContext := dCliContextStore.Metadata{
		Name:     "foo",
		Metadata: nil,
		Endpoints: map[string]interface{}{
			key: dContext.EndpointMetaBase{
				Host:          host,
				SkipTLSVerify: false,
			},
		},
	}
	return TestContext{
		context:           dockerContext,
		expected_endpoint: host,
	}
}

func TestCreateContext(t *testing.T) {
	err := client.CreateContext("testContext0", "wronguser", "wrongport")
	if err == nil {
		t.Error("client.CreateContext(\"testContextCreate\", \"wronguser\", \"wrongport\") should have failed but didn't return an error")
	}
	err = client.CreateContext("testContext0", "", "")
	if err != nil {
		t.Errorf("Couldn't create context: %s", err)
	}
}

func TestDeleteContext(t *testing.T) {
	ensureTestState(1, 1)
	err := client.DeleteContext("default")
	if err == nil {
		t.Errorf("client.DeleteContext(\"default\") should have failed but didn't return an error")
	}

	err = client.DeleteContext("testContext0")
	if err != nil {
		t.Errorf("client.DeleteContext(\"testContext0\") failed: %s", err)
	}
	err = client.DeleteContext("testContextFail0")
	if err == nil {
		t.Errorf("client.DeleteContext(\"testContextFail0\") should have failed (attempt to delete non-existent context) but didn't return an error")
	}
}

func TestGetContextEndpoint(t *testing.T) {
	var testDockerContexts = []TestContext{
		dockerContext("ssh://foobar", "docker"),
		dockerContext("ssh://foobar", "k8"),
	}
	for _, context := range testDockerContexts {
		endpoint, err := client.GetContextEndpoint(context.context)
		if err != nil {
			if err.Error() != "context lacks Docker endpoint" {
				t.Error(err)
			}
		} else {
			if endpoint != context.expected_endpoint {
				t.Errorf("did not get correct context endpoint. Expected: %s, received: %s", context.expected_endpoint, endpoint)
			}
		}

	}

}