package main

import (
	"fmt"
	"io/ioutil"
	"os"
	"os/exec"
	"path/filepath"
	"sync"
)

var ensureHTTPServerOnce sync.Once

func ensureHTTPServerImage() error {
	var doIt bool
	ensureHTTPServerOnce.Do(func() {
		doIt = true
	})

	if !doIt {
		return nil
	}

	protectedImages["httpserver:latest"] = struct{}{}

	tmp, err := ioutil.TempDir("", "docker-http-server-test")
	if err != nil {
		return fmt.Errorf("could not build http server: %v", err)
	}
	defer os.RemoveAll(tmp)

	goos := daemonPlatform
	if goos == "" {
		goos = "linux"
	}
	goarch := os.Getenv("DOCKER_ENGINE_GOARCH")
	if goarch == "" {
		goarch = "amd64"
	}

	goCmd, lookErr := exec.LookPath("go")
	if lookErr != nil {
		return fmt.Errorf("could not build http server: %v", lookErr)
	}

	cmd := exec.Command(goCmd, "build", "-o", filepath.Join(tmp, "httpserver"), "github.com/docker/docker/contrib/httpserver")
	cmd.Env = append(os.Environ(), []string{
		"CGO_ENABLED=0",
		"GOOS=" + goos,
		"GOARCH=" + goarch,
	}...)
	var out []byte
	if out, err = cmd.CombinedOutput(); err != nil {
		return fmt.Errorf("could not build http server: %s", string(out))
	}

	cpCmd, lookErr := exec.LookPath("cp")
	if lookErr != nil {
		return fmt.Errorf("could not build http server: %v", lookErr)
	}
	if out, err = exec.Command(cpCmd, "../contrib/httpserver/Dockerfile", filepath.Join(tmp, "Dockerfile")).CombinedOutput(); err != nil {
		return fmt.Errorf("could not build http server: %v", string(out))
	}

	if out, err = exec.Command(dockerBinary, "build", "-q", "-t", "httpserver", tmp).CombinedOutput(); err != nil {
		return fmt.Errorf("could not build http server: %v", string(out))
	}
	return nil
}
