package image

import (
	v1 "github.com/google/go-containerregistry/pkg/v1"
	"github.com/hashicorp/go-multierror"

	"github.com/aquasecurity/trivy/pkg/fanal/types"
)

func NewArchiveImage(fileName string) (types.Image, error) {
	img, err := newImage(fileName)
	if err != nil {
		return nil, err
	}
	return archiveImage{
		name:  fileName,
		Image: img,
	}, nil
}

func newImage(fileName string) (v1.Image, error) {
	var errs error

	// Docker archive
	img, err := tryDockerArchive(fileName)
	if err == nil {
		// Return v1.Image if the file can be opened as Docker archive
		return img, nil
	}
	errs = multierror.Append(errs, err)

	// OCI layout
	img, err = tryOCI(fileName)
	if err == nil {
		// Return v1.Image if the directory can be opened as OCI Image Format
		return img, nil
	}
	errs = multierror.Append(errs, err)

	return nil, errs
}

type archiveImage struct {
	v1.Image
	name string
}

func (img archiveImage) Name() string {
	return img.name
}

func (img archiveImage) ID() (string, error) {
	return ID(img)
}

// LayerIDs returns a list of uncompressed layer IDs
func (img archiveImage) LayerIDs() ([]string, error) {
	return LayerIDs(img)
}

// RepoTags returns empty as an archive doesn't support RepoTags
func (archiveImage) RepoTags() []string {
	return nil
}

// RepoDigests returns empty as an archive doesn't support RepoDigests
func (archiveImage) RepoDigests() []string {
	return nil
}
