// 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.

// The following enables go generate to generate the doc.go file.
//go:generate go run $V23_ROOT/release/go/src/v.io/x/lib/cmdline/testdata/gendoc.go . -help

package main

import (
	"fmt"

	"v.io/v23/context"
	"v.io/x/lib/cmdline"
	"v.io/x/ref/lib/security/securityflag"
	"v.io/x/ref/lib/signals"
	"v.io/x/ref/lib/v23cmd"
	"v.io/x/ref/lib/xrpc"
	_ "v.io/x/ref/runtime/factories/roaming"
)

var name, store string

func main() {
	cmdProfileD.Flags.StringVar(&name, "name", "", "Name to mount the profile repository as.")
	cmdProfileD.Flags.StringVar(&store, "store", "", "Local directory to store profiles in.")

	cmdline.HideGlobalFlagsExcept()
	cmdline.Main(cmdProfileD)
}

var cmdProfileD = &cmdline.Command{
	Runner: v23cmd.RunnerFunc(runProfileD),
	Name:   "profiled",
	Short:  "Runs the profile daemon.",
	Long: `
Command profiled runs the profile daemon, which implements the
v.io/x/ref/services/repository.Profile interface.
`,
}

func runProfileD(ctx *context.T, env *cmdline.Env, args []string) error {
	if store == "" {
		return env.UsageErrorf("Specify a directory for storing profiles using --store=<name>")
	}

	dispatcher, err := NewDispatcher(store, securityflag.NewAuthorizerOrDie())
	if err != nil {
		return fmt.Errorf("NewDispatcher() failed: %v", err)
	}

	server, err := xrpc.NewDispatchingServer(ctx, name, dispatcher)
	if err != nil {
		return fmt.Errorf("NewServer() failed: %v", err)
	}
	ctx.Infof("Profile repository running at endpoint=%v", server.Status().Endpoints[0])

	// Wait until shutdown.
	<-signals.ShutdownOnSignals(ctx)
	return nil
}
