package cnbutils

import (
	"encoding/base64"
	"encoding/json"
	"fmt"

	"github.com/SAP/jenkins-library/pkg/log"
	"github.com/docker/cli/cli/config/configfile"
)

func GenerateCnbAuth(config string, utils BuildUtils) (string, error) {
	var err error
	dockerConfig := &configfile.ConfigFile{}

	if config != "" {
		dockerConfigJSON, err := utils.FileRead(config)
		if err != nil {
			return "", err
		}

		err = json.Unmarshal(dockerConfigJSON, dockerConfig)
		if err != nil {
			return "", err
		}
	}

	auth := map[string]string{}
	for registry, value := range dockerConfig.AuthConfigs {
		if value.Auth == "" && value.Username == "" && value.Password == "" {
			log.Entry().Warnf("docker config.json contains empty credentials for registry %q. Either 'auth' or 'username' and 'password' have to be provided.", registry)
			continue
		}

		if value.Auth == "" {
			value.Auth = encodeAuth(value.Username, value.Password)
		}

		log.Entry().Debugf("Adding credentials for: registry %q", registry)

		auth[registry] = fmt.Sprintf("Basic %s", value.Auth)
	}

	cnbRegistryAuth, err := json.Marshal(auth)
	if err != nil {
		return "", err
	}

	return string(cnbRegistryAuth), nil
}

func encodeAuth(username, password string) string {
	auth := username + ":" + password
	return base64.StdEncoding.EncodeToString([]byte(auth))
}
