package system

import (
	"fmt"
	"strconv"
	"strings"
	"testing"

	"github.com/moby/moby/client"
	"github.com/moby/moby/v2/internal/testutil/request"
	"gotest.tools/v3/assert"
	is "gotest.tools/v3/assert/cmp"
)

func TestVersion(t *testing.T) {
	ctx := setupTest(t)
	apiClient := testEnv.APIClient()

	version, err := apiClient.ServerVersion(ctx)
	assert.NilError(t, err)

	assert.Check(t, version.APIVersion != "")
	assert.Check(t, version.Version != "")
	assert.Check(t, version.MinAPIVersion != "")
	assert.Check(t, is.Equal(testEnv.DaemonInfo.ExperimentalBuild, version.Experimental))
	assert.Check(t, is.Equal(testEnv.DaemonInfo.OSType, version.Os))
}

func TestAPIClientVersionOldNotSupported(t *testing.T) {
	ctx := setupTest(t)
	major, minor, _ := strings.Cut(testEnv.DaemonVersion.MinAPIVersion, ".")
	vMinInt, err := strconv.Atoi(minor)
	assert.NilError(t, err)
	vMinInt--
	version := fmt.Sprintf("%s.%d", major, vMinInt)
	apiClient := request.NewAPIClient(t, client.WithVersion(version))

	expectedErrorMessage := fmt.Sprintf("Error response from daemon: client version %s is too old. Minimum supported API version is %s, please upgrade your client to a newer version", version, testEnv.DaemonVersion.MinAPIVersion)
	_, err = apiClient.ServerVersion(ctx)
	assert.Error(t, err, expectedErrorMessage)
}