package registry

import (
	"github.com/docker/cli/cli/config"
	"github.com/docker/cli/cli/config/configfile"
	"github.com/docker/cli/cli/config/credentials"
	"oras.land/oras-go/v2/registry/remote/auth"
)

// DockerCredentialStore for Docker registry credentials, like ~/.docker/config.json.
type DockerCredentialStore struct {
	configFile *configfile.ConfigFile
}

// CredentialsConfigLoad load credentials from directory.
func CredentialsConfigLoad() (*configfile.ConfigFile, error) {
	return config.Load(registryConfigPath)
}

// NewDockerCredentialStore creates a DockerCredentialStore.
func NewDockerCredentialStore(configFile *configfile.ConfigFile) *DockerCredentialStore {
	if !configFile.ContainsAuth() {
		configFile.CredentialsStore = credentials.DetectDefaultStore(configFile.CredentialsStore)
	}
	return &DockerCredentialStore{
		configFile: configFile,
	}
}

// Credential get an authentication credential for a given registry.
func (cs *DockerCredentialStore) Credential(registry string) (auth.Credential, error) {
	authConf, err := cs.configFile.GetCredentialsStore(registry).Get(registry)
	if err != nil {
		return auth.EmptyCredential, err
	}
	cred := auth.Credential{
		Username:     authConf.Username,
		Password:     authConf.Password,
		AccessToken:  authConf.RegistryToken,
		RefreshToken: authConf.IdentityToken,
	}
	return cred, nil
}