package manifest

import (
	"context"

	manifesttypes "github.com/docker/cli/cli/manifest/types"
	"github.com/docker/cli/cli/registry/client"
	"github.com/docker/distribution"
	"github.com/docker/distribution/reference"
	"github.com/opencontainers/go-digest"
)

type fakeRegistryClient struct {
	getManifestFunc     func(ctx context.Context, ref reference.Named) (manifesttypes.ImageManifest, error)
	getManifestListFunc func(ctx context.Context, ref reference.Named) ([]manifesttypes.ImageManifest, error)
	mountBlobFunc       func(ctx context.Context, source reference.Canonical, target reference.Named) error
	putManifestFunc     func(ctx context.Context, source reference.Named, mf distribution.Manifest) (digest.Digest, error)
	getTagsFunc         func(ctx context.Context, ref reference.Named) ([]string, error)
}

func (c *fakeRegistryClient) GetManifest(ctx context.Context, ref reference.Named) (manifesttypes.ImageManifest, error) {
	if c.getManifestFunc != nil {
		return c.getManifestFunc(ctx, ref)
	}
	return manifesttypes.ImageManifest{}, nil
}

func (c *fakeRegistryClient) GetManifestList(ctx context.Context, ref reference.Named) ([]manifesttypes.ImageManifest, error) {
	if c.getManifestListFunc != nil {
		return c.getManifestListFunc(ctx, ref)
	}
	return nil, nil
}

func (c *fakeRegistryClient) MountBlob(ctx context.Context, source reference.Canonical, target reference.Named) error {
	if c.mountBlobFunc != nil {
		return c.mountBlobFunc(ctx, source, target)
	}
	return nil
}

func (c *fakeRegistryClient) PutManifest(ctx context.Context, ref reference.Named, mf distribution.Manifest) (digest.Digest, error) {
	if c.putManifestFunc != nil {
		return c.putManifestFunc(ctx, ref, mf)
	}
	return digest.Digest(""), nil
}

func (c *fakeRegistryClient) GetTags(ctx context.Context, ref reference.Named) ([]string, error) {
	if c.getTagsFunc != nil {
		return c.getTagsFunc(ctx, ref)
	}
	return nil, nil
}

var _ client.RegistryClient = &fakeRegistryClient{}
