package mocks

import godigest "github.com/opencontainers/go-digest"

type CacheMock struct {
	// Returns the human-readable "name" of the driver.
	NameFn func() string

	GetAllBlobsFn func(digest godigest.Digest) ([]string, error)

	// Retrieves the blob matching provided digest.
	GetBlobFn func(digest godigest.Digest) (string, error)

	// Uploads blob to cachedb.
	PutBlobFn func(digest godigest.Digest, path string) error

	// Check if blob exists in cachedb.
	HasBlobFn func(digest godigest.Digest, path string) bool

	// Delete a blob from the cachedb.
	DeleteBlobFn func(digest godigest.Digest, path string) error

	UsesRelativePathsFn func() bool
}

func (cacheMock CacheMock) UsesRelativePaths() bool {
	if cacheMock.UsesRelativePathsFn != nil {
		return cacheMock.UsesRelativePaths()
	}

	return false
}

func (cacheMock CacheMock) Name() string {
	if cacheMock.NameFn != nil {
		return cacheMock.NameFn()
	}

	return "mock"
}

func (cacheMock CacheMock) GetBlob(digest godigest.Digest) (string, error) {
	if cacheMock.GetBlobFn != nil {
		return cacheMock.GetBlobFn(digest)
	}

	return "", nil
}

func (cacheMock CacheMock) PutBlob(digest godigest.Digest, path string) error {
	if cacheMock.PutBlobFn != nil {
		return cacheMock.PutBlobFn(digest, path)
	}

	return nil
}

func (cacheMock CacheMock) HasBlob(digest godigest.Digest, path string) bool {
	if cacheMock.HasBlobFn != nil {
		return cacheMock.HasBlobFn(digest, path)
	}

	return true
}

func (cacheMock CacheMock) DeleteBlob(digest godigest.Digest, path string) error {
	if cacheMock.DeleteBlobFn != nil {
		return cacheMock.DeleteBlobFn(digest, path)
	}

	return nil
}

func (cacheMock CacheMock) GetAllBlobs(digest godigest.Digest) ([]string, error) {
	if cacheMock.GetAllBlobsFn != nil {
		return cacheMock.GetAllBlobsFn(digest)
	}

	return []string{}, nil
}
