// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package test

import (
	"bytes"
	"io"
	"os"
	"os/exec"
	"path/filepath"
	"strings"

	"v.io/jiri"
	"v.io/jiri/collect"
	"v.io/jiri/retry"
	"v.io/x/devtools/internal/test"
	"v.io/x/devtools/internal/xunit"
)

// vanadiumBootstrap checks that the Vanadium install script, bootstrap.sh,
// executes successfully.
func vanadiumBootstrap(jirix *jiri.X, testName string, _ ...Opt) (_ *test.Result, e error) {
	// Initialize the test.
	cleanup, err := initTest(jirix, testName, nil)
	if err != nil {
		return nil, newInternalError(err, "Init")
	}
	defer collect.Error(func() error { return cleanup() }, &e)

	s := jirix.NewSeq()

	// Create a new temporary JIRI_ROOT.
	oldRoot := os.Getenv("JIRI_ROOT")
	defer collect.Error(func() error { return os.Setenv("JIRI_ROOT", oldRoot) }, &e)
	tmpDir, err := s.TempDir("", "")
	if err != nil {
		return nil, newInternalError(err, "TempDir")
	}
	defer collect.Error(func() error { return jirix.NewSeq().RemoveAll(tmpDir).Done() }, &e)

	root := filepath.Join(tmpDir, "root")
	if err := os.Setenv("JIRI_ROOT", root); err != nil {
		return nil, newInternalError(err, "Setenv")
	}

	// Run the setup script.
	var out bytes.Buffer
	stdout := io.MultiWriter(jirix.Stdout(), &out)
	stderr := io.MultiWriter(jirix.Stderr(), &out)
	// Find the PATH element containing the "jiri" binary and remove it.
	jiriPath, err := exec.LookPath("jiri")
	if err != nil {
		return nil, newInternalError(err, "LookPath")
	}
	env := jirix.Env()
	env["PATH"] = strings.Replace(os.Getenv("PATH"), filepath.Dir(jiriPath), "", -1)
	env["JIRI_ROOT"] = root
	fn := func() error {
		return s.Env(env).Capture(stdout, stderr).Last(filepath.Join(oldRoot, "website", "public", "bootstrap.sh"))
	}
	if err := retry.Function(jirix.Context, fn); err != nil {
		// Create xUnit report.
		if err := xunit.CreateFailureReport(jirix, testName, "VanadiumGo", "bootstrap", "Vanadium bootstrapping failed", out.String()); err != nil {
			return nil, err
		}
		return &test.Result{Status: test.Failed}, nil
	}
	return &test.Result{Status: test.Passed}, nil
}
