package docker

import (
	"context"
	"github.com/docker/docker/api/types"
	"github.com/docker/docker/api/types/filters"
	"github.com/docker/docker/client"
	"io"
)

type Image struct {
	ref string
}

func (i Image) Ref() string {
	return i.ref
}

// NewImage creates a new Image instance
func NewImage(ctx context.Context, cli *client.Client, ref string) (Image, io.ReadCloser, error) {
	summary, err := cli.ImageList(ctx, types.ImageListOptions{
		Filters: filters.NewArgs(filters.Arg("reference", ref)),
	})
	if err != nil {
		return Image{}, nil, err
	}

	if len(summary) > 0 {
		return Image{
			ref: ref,
		}, nil, nil
	} else {
		out, err := cli.ImagePull(ctx, ref, types.ImagePullOptions{})
		if err != nil {
			return Image{}, nil, err
		}
		return Image{
			ref: ref,
		}, out, nil
	}
}