package containerd

import (
	"encoding/json"
	"fmt"
	"os"
	"path/filepath"

	"github.com/pkg/errors"
)

const (
	defaultAddress = `\\.\pipe\containerd-containerd-test`
	testImage      = "docker.io/library/go:nanoserver"
)

var (
	dockerLayerFolders []string

	defaultRoot = filepath.Join(os.Getenv("programfiles"), "containerd", "root-test")
)

func platformTestSetup(client *Client) error {
	var (
		roots       []string
		layerChains = make(map[string]string)
	)
	// Since we can't pull images yet, we'll piggyback on the default
	// docker's images
	wfPath := `C:\ProgramData\docker\windowsfilter`
	wf, err := os.Open(wfPath)
	if err != nil {
		return errors.Wrapf(err, "failed to access docker layers @ %s", wfPath)
	}
	defer wf.Close()
	entries, err := wf.Readdirnames(0)
	if err != nil {
		return errors.Wrapf(err, "failed to read %s entries", wfPath)
	}

	for _, fn := range entries {
		layerChainPath := filepath.Join(wfPath, fn, "layerchain.json")
		lfi, err := os.Stat(layerChainPath)
		switch {
		case err == nil && lfi.Mode().IsRegular():
			f, err := os.OpenFile(layerChainPath, os.O_RDONLY, 0660)
			if err != nil {
				fmt.Fprintln(os.Stderr,
					errors.Wrapf(err, "failed to open %s", layerChainPath))
				continue
			}
			defer f.Close()
			l := make([]string, 0)
			if err := json.NewDecoder(f).Decode(&l); err != nil {
				fmt.Fprintln(os.Stderr,
					errors.Wrapf(err, "failed to decode %s", layerChainPath))
				continue
			}
			switch {
			case len(l) == 1:
				layerChains[l[0]] = filepath.Join(wfPath, fn)
			case len(l) > 1:
				fmt.Fprintf(os.Stderr, "Too many entries in %s: %d", layerChainPath, len(l))
			case len(l) == 0:
				roots = append(roots, filepath.Join(wfPath, fn))
			}
		case os.IsNotExist(err):
			// keep on going
		default:
			return errors.Wrapf(err, "error trying to access %s", layerChainPath)
		}
	}

	// They'll be 2 roots, just take the first one
	l := roots[0]
	dockerLayerFolders = append(dockerLayerFolders, l)
	for {
		l = layerChains[l]
		if l == "" {
			break
		}

		dockerLayerFolders = append([]string{l}, dockerLayerFolders...)
	}

	return nil
}
