package cockroachdb_instance

import (
	"context"
	"fmt"
	"os"
	"os/exec"
	"sync"

	"go.skia.org/infra/bazel/external/cockroachdb"
	"go.skia.org/infra/go/emulators"
	"go.skia.org/infra/go/skerr"
	"go.skia.org/infra/go/sktest"
)

// Require starts or verifies that a long-living instance of CockroachDB is running.
//
// When running locally, the test case will fail if the corresponding environment variable is unset.
// When running under RBE, the first invocation of this function will start the emulator and set the
// appropriate environment variable, and any subsequent calls will reuse the emulator instance.
func Require(t sktest.TestingT) {
	emulators.RequireEmulator(t, emulators.CockroachDB, StartCockroachDBIfNotRunning)
}

var (
	isRunning      bool
	isRunningMutex sync.Mutex
)

// StartCockroachDBIfNotRunning returns true if it successfully started CockroachDB, false (and
// maybe an error) if it did not (possibly because it was already running).
func StartCockroachDBIfNotRunning() (bool, error) {
	isRunningMutex.Lock()
	defer isRunningMutex.Unlock()
	if isRunning {
		return false, nil
	}
	cockroachExe, err := cockroachdb.FindCockroach()
	if err != nil {
		return false, skerr.Wrapf(err, "finding Bazel-downloaded cockroach command")
	}

	// Read the CockroachDB storage directory from an environment variable, or create a temp dir.
	cockroachDBStoreDir := os.Getenv("COCKROACHDB_EMULATOR_STORE_DIR")
	if cockroachDBStoreDir == "" {
		cockroachDBStoreDir, err = os.MkdirTemp("", "crdb-emulator-*")
		if err != nil {
			return false, skerr.Wrapf(err, "setting up temp directory")
		}
	}

	// We intentionally do not take a context parameter because we want this instance to
	// outlive this test invocation (and be re-used by future tests).
	cmd := exec.CommandContext(context.Background(), cockroachExe,
		"start-single-node", "--insecure",
		fmt.Sprintf("--listen-addr=localhost:%d", emulators.CockroachDBPort),
		"--store="+cockroachDBStoreDir,
		"--http-addr=0", // Web UI not needed for tests
	)
	if err := emulators.StartForRBE(cmd); err != nil {
		return false, skerr.Wrap(err)
	}
	isRunning = true
	return true, nil
}
