package mocks

import (
	"context"

	"github.com/containers/image/v5/types"
	"github.com/opencontainers/go-digest"
)

type SyncRemote struct {
	// Get temporary ImageReference, is used by functions in containers/image package
	GetImageReferenceFn func(repo string, tag string) (types.ImageReference, error)

	// Get local oci layout context, is used by functions in containers/image package
	GetContextFn func() *types.SystemContext

	// Get a list of repos (catalog)
	GetRepositoriesFn func(ctx context.Context) ([]string, error)

	// Get a list of tags given a repo
	GetRepoTagsFn func(repo string) ([]string, error)

	GetDockerRemoteRepoFn func(repo string) string

	// Get manifest content, mediaType, digest given an ImageReference
	GetManifestContentFn func(imageReference types.ImageReference) ([]byte, string, digest.Digest, error)
}

func (remote SyncRemote) GetDockerRemoteRepo(repo string) string {
	if remote.GetDockerRemoteRepoFn != nil {
		return remote.GetDockerRemoteRepoFn(repo)
	}

	return ""
}

func (remote SyncRemote) GetImageReference(repo string, tag string) (types.ImageReference, error) {
	if remote.GetImageReferenceFn != nil {
		return remote.GetImageReferenceFn(repo, tag)
	}

	return nil, nil //nolint:nilnil
}

func (remote SyncRemote) GetContext() *types.SystemContext {
	if remote.GetContextFn != nil {
		return remote.GetContextFn()
	}

	return nil
}

func (remote SyncRemote) GetRepositories(ctx context.Context) ([]string, error) {
	if remote.GetRepositoriesFn != nil {
		return remote.GetRepositoriesFn(ctx)
	}

	return []string{}, nil
}

func (remote SyncRemote) GetRepoTags(repo string) ([]string, error) {
	if remote.GetRepoTagsFn != nil {
		return remote.GetRepoTagsFn(repo)
	}

	return []string{}, nil
}

func (remote SyncRemote) GetManifestContent(imageReference types.ImageReference) (
	[]byte, string, digest.Digest, error,
) {
	if remote.GetManifestContentFn != nil {
		return remote.GetManifestContentFn(imageReference)
	}

	return nil, "", "", nil
}

func (remote SyncRemote) SetUpstreamAuthConfig(username, password string) {
}
