// TODO(sadovsky): Use utils from veyron/rt/blackbox/util_test.go.

package test

import (
	"crypto/rand"
	"io/ioutil"
	"log"
	"os"

	"veyron/services/store/server"

	"veyron2"
	"veyron2/naming"
	"veyron2/rt"
	"veyron2/security"
	"veyron2/storage"
	"veyron2/storage/vstore"
)

// getRuntime initializes the veyron2.Runtime if needed, then returns it.
func getRuntime() veyron2.Runtime {
	// returns Runtime if already initialized
	return rt.Init(veyron2.LocalID(security.FakePrivateID("todos")))
}

// startServer starts a store server and returns the server name as well as a
// function to close the server.
func startServer() (string, func()) {
	r := getRuntime()

	// Create a new server instance.
	s, err := r.NewServer()
	if err != nil {
		log.Fatal("r.NewServer() failed: ", err)
	}

	// Make dbName.
	var buf [16]byte
	if _, err := rand.Read(buf[:]); err != nil {
		log.Fatal("rand.Read() failed: ", err)
	}
	dbDir, err := ioutil.TempDir("", "db")
	if err != nil {
		log.Fatal("ioutil.TempDir() failed: ", err)
	}

	// Create a new StoreService.
	// TODO(ashankar): This "anonymous" is a special string that VCs
	// default to.  This really should be the identity used by the runtime.
	storeService, err := server.New(server.ServerConfig{Admin: r.Identity().PublicID(), DBName: dbDir})
	if err != nil {
		log.Fatal("server.New() failed: ", err)
	}

	// Register the services.
	storeDisp := server.NewStoreDispatcher(storeService, nil)

	// Create an endpoint and start listening.
	ep, err := s.Listen("tcp", "127.0.0.1:0")
	if err != nil {
		log.Fatal("s.Listen() failed: ", err)
	}
	if err := s.Serve("", storeDisp); err != nil {
		log.Fatal("s.Serve(storeDisp) failed: ", err)
	}
	return naming.JoinAddressName(ep.String(), "//"), func() {
		s.Stop()
		os.Remove(dbDir)
	}
}

// makeClient creates a client and returns a function to close the client.
func makeClient(name string) (storage.Store, func()) {
	getRuntime() // verify that Runtime was initialized
	st, err := vstore.New(name)
	if err != nil {
		log.Fatal("vstore.New() failed: ", err)
	}
	cl := func() {
		if err := st.Close(); err != nil {
			log.Fatal("st.Close() failed: ", err)
		}
	}
	return st, cl
}

// startServerAndMakeClient calls startServer and makeClient. It returns the
// client as well as a function to close everything.
func startServerAndMakeClient() (storage.Store, func()) {
	mount, clServer := startServer()
	st, clClient := makeClient(mount)
	cl := func() {
		clServer()
		clClient()
	}
	return st, cl
}
