// Package client provides Docker client initiatialisation functions.
package client

import (
	"net/http"
	"os"
	"time"

	contextPkg "coopcloud.tech/abra/pkg/context"
	commandconnPkg "coopcloud.tech/abra/pkg/upstream/commandconn"
	"github.com/docker/docker/client"
	"github.com/sirupsen/logrus"
)

// New initiates a new Docker client.
func New(contextName string) (*client.Client, error) {
	var clientOpts []client.Opt

	if contextName != "default" {
		context, err := GetContext(contextName)
		if err != nil {
			return nil, err
		}

		ctxEndpoint, err := contextPkg.GetContextEndpoint(context)
		if err != nil {
			return nil, err
		}

		helper, err := commandconnPkg.NewConnectionHelper(ctxEndpoint)
		if err != nil {
			return nil, err
		}

		httpClient := &http.Client{
			// No tls, no proxy
			Transport: &http.Transport{
				DialContext:     helper.Dialer,
				IdleConnTimeout: 30 * time.Second,
			},
		}

		clientOpts = append(clientOpts,
			client.WithHTTPClient(httpClient),
			client.WithHost(helper.Host),
			client.WithDialContext(helper.Dialer),
		)
	}

	version := os.Getenv("DOCKER_API_VERSION")
	if version != "" {
		clientOpts = append(clientOpts, client.WithVersion(version))
	} else {
		clientOpts = append(clientOpts, client.WithAPIVersionNegotiation())
	}

	cl, err := client.NewClientWithOpts(clientOpts...)
	if err != nil {
		return nil, err
	}

	logrus.Debugf("created client for %s", contextName)

	return cl, nil
}