// Copyright 2016 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 commands

import (
	"fmt"

	"v.io/v23"
	"v.io/v23/context"
	"v.io/v23/syncbase"
	"v.io/x/lib/cmdline"
	"v.io/x/ref/cmd/sb/dbutil"
	"v.io/x/ref/lib/v23cmd"
)

// Commands holds all the commands runnable at the top level (as $ sb foo)
// and in the shell, as:
// $ sb sh
// ? foo
// with the exception of shell builtins like help and quit. Adding a command
// to Commands will make it accessible by either mechanism.
var Commands = []*cmdline.Command{
	cmdDump,
	cmdMakeDemo,
	cmdSelect,
	cmdSg,
	cmdAcl,
}

var (
	commandCtx *context.T
	commandDb  syncbase.Database
)

func SetCtx(ctx *context.T) {
	commandCtx = ctx
}

func SetDB(db syncbase.Database) {
	commandDb = db
}

type sbHandler func(ctx *context.T, db syncbase.Database, env *cmdline.Env, args []string) error

func SbRunner(handler sbHandler) cmdline.Runner {
	return v23cmd.RunnerFuncWithInit(
		func(ctx *context.T, env *cmdline.Env, args []string) error {
			db := commandDb // Set in shell handler.
			if db == nil {
				var err error
				if db, err = dbutil.OpenDB(ctx); err != nil {
					return err
				}
			}
			return handler(ctx, db, env, args)
		},
		sbInit)
}

func sbInit() (*context.T, v23.Shutdown, error) {
	if commandCtx != nil {
		return commandCtx, func() {}, nil
	}
	return v23.TryInit()
}

type sbHandlerPlain func(ctx *context.T, env *cmdline.Env, args []string) error

func sbRunnerPlain(handler sbHandlerPlain) cmdline.Runner {
	return v23cmd.RunnerFuncWithInit(handler, sbInit)
}

func GetCommand(name string) (*cmdline.Command, error) {
	for _, cmd := range Commands {
		if cmd.Name == name {
			return cmd, nil
		}
	}

	return nil, fmt.Errorf("no command %q", name)
}

func PrintUsage(command *cmdline.Command) {
	fmt.Println(command.Long)
	fmt.Println()
	fmt.Println("Usage:")
	fmt.Printf("\t%s [flags] %s\n", command.Name, command.ArgsName)
	fmt.Println()
	fmt.Println(command.ArgsLong)
}
