// 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 $JIRI_ROOT/release/go/src/v.io/x/lib/cmdline/testdata/gendoc.go .

package main

import (
	"encoding/json"
	"fmt"
	"os"

	"v.io/v23/context"
	"v.io/v23/security/access"
	"v.io/v23/services/groups"
	"v.io/x/lib/cmdline"
	"v.io/x/lib/set"
	"v.io/x/ref/lib/v23cmd"
	_ "v.io/x/ref/runtime/factories/generic"
)

type relateResult struct {
	Remainder      map[string]struct{}
	Approximations []groups.Approximation
	Version        string
}

var (
	flagPermFile      string
	flagVersion       string
	flagApproximation string

	cmdCreate = &cmdline.Command{
		Name:     "create",
		Short:    "Creates a blessing pattern group",
		Long:     "Creates a blessing pattern group.",
		ArgsName: "<von> <patterns...>",
		ArgsLong: `
<von> is the vanadium object name of the group to create

<patterns...> is a list of blessing pattern chunks
`,
		Runner: v23cmd.RunnerFunc(func(ctx *context.T, env *cmdline.Env, args []string) error {
			// Process command-line arguments.
			if want, got := 1, len(args); want > got {
				return env.UsageErrorf("create: unexpected number of arguments, want at least %d, got %d", want, got)
			}
			von := args[0]
			var patterns []groups.BlessingPatternChunk
			for _, pattern := range args[1:] {
				patterns = append(patterns, groups.BlessingPatternChunk(pattern))
			}
			// Process command-line flags.
			var permissions access.Permissions
			if flagPermFile != "" {
				file, err := os.Open(flagPermFile)
				if err != nil {
					return fmt.Errorf("Open(%v) failed: %v", flagPermFile, err)
				}
				permissions, err = access.ReadPermissions(file)
				if err != nil {
					return err
				}
			}
			// Invoke the "create" RPC.
			client := groups.GroupClient(von)
			return client.Create(ctx, permissions, patterns)
		}),
	}

	cmdDelete = &cmdline.Command{
		Name:     "delete",
		Short:    "Delete a blessing group",
		Long:     "Delete a blessing group.",
		ArgsName: "<von>",
		ArgsLong: "<von> is the vanadium object name of the group",
		Runner: v23cmd.RunnerFunc(func(ctx *context.T, env *cmdline.Env, args []string) error {
			// Process command-line arguments.
			if want, got := 1, len(args); want != got {
				return env.UsageErrorf("delete: unexpected number of arguments, want %d, got %d", want, got)
			}
			von := args[0]
			// Invoke the "delete" RPC.
			client := groups.GroupClient(von)
			return client.Delete(ctx, flagVersion)
		}),
	}

	cmdAdd = &cmdline.Command{
		Name:     "add",
		Short:    "Adds a blessing pattern to a group",
		Long:     "Adds a blessing pattern to a group.",
		ArgsName: "<von> <pattern>",
		ArgsLong: `
<von> is the vanadium object name of the group

<pattern> is the blessing pattern chunk to add
`,
		Runner: v23cmd.RunnerFunc(func(ctx *context.T, env *cmdline.Env, args []string) error {
			// Process command-line arguments.
			if want, got := 2, len(args); want != got {
				return env.UsageErrorf("add: unexpected number of arguments, want %d, got %d", want, got)
			}
			von, pattern := args[0], args[1]
			// Invoke the "add" RPC.
			client := groups.GroupClient(von)
			return client.Add(ctx, groups.BlessingPatternChunk(pattern), flagVersion)
		}),
	}

	cmdRemove = &cmdline.Command{
		Name:     "remove",
		Short:    "Removes a blessing pattern from a group",
		Long:     "Removes a blessing pattern from a group.",
		ArgsName: "<von> <pattern>",
		ArgsLong: `
<von> is the vanadium object name of the group

<pattern> is the blessing pattern chunk to add
`,
		Runner: v23cmd.RunnerFunc(func(ctx *context.T, env *cmdline.Env, args []string) error {
			// Process command-line arguments.
			if want, got := 2, len(args); want != got {
				return env.UsageErrorf("remove: unexpected number of arguments, want %d, got %d", want, got)
			}
			von, pattern := args[0], args[1]
			// Invoke the "remove" RPC.
			client := groups.GroupClient(von)
			return client.Remove(ctx, groups.BlessingPatternChunk(pattern), flagVersion)
		}),
	}

	cmdRelate = &cmdline.Command{
		Name:  "relate",
		Short: "Relate a set of blessing to a group",
		Long: `
Relate a set of blessing to a group. The result is returned as a
JSON-encoded output.

NOTE: This command exists primarily for debugging purposes. In
particular, invocations of the Relate RPC are expected to be mainly
issued by the authorization logic.
`,
		ArgsName: "<von> <blessings>",
		ArgsLong: `
<von> is the vanadium object name of the group

<blessings...> is a list of blessings
`,
		Runner: v23cmd.RunnerFunc(func(ctx *context.T, env *cmdline.Env, args []string) error {
			// Process command-line arguments.
			if want, got := 1, len(args); want > got {
				return env.UsageErrorf("relate: unexpected number of arguments, want at least %d, got %d", want, got)
			}
			von := args[0]
			blessings := set.String.FromSlice(args[1:])
			// Process command-line flags.
			var hint groups.ApproximationType
			switch flagApproximation {
			case "under":
				hint = groups.ApproximationTypeUnder
			case "over":
				hint = groups.ApproximationTypeOver
			}
			// Invoke the "relate" RPC.
			client := groups.GroupClient(von)
			remainder, approximations, version, err := client.Relate(ctx, blessings, hint, flagVersion, nil)
			if err != nil {
				return err
			}
			result := relateResult{
				Remainder:      remainder,
				Approximations: approximations,
				Version:        version,
			}
			bytes, err := json.MarshalIndent(result, "", "  ")
			if err != nil {
				return fmt.Errorf("MarshalIndent(%v) failed: %v", result, err)
			}
			fmt.Fprintf(env.Stdout, "%v\n", string(bytes))
			return nil
		}),
	}

	cmdGet = &cmdline.Command{
		Name:     "get",
		Short:    "Returns entries of a group",
		Long:     "Returns entries of a group.",
		ArgsName: "<von>",
		ArgsLong: "<von> is the vanadium object name of the group",
		Runner: v23cmd.RunnerFunc(func(ctx *context.T, env *cmdline.Env, args []string) error {
			// TODO(jsimsa): Implement once the corresponding server-side
			// API is designed.
			return fmt.Errorf(`the "groups get ..." sub-command is not implemented`)
		}),
	}

	cmdRoot = &cmdline.Command{
		Name:     "groups",
		Short:    "creates and manages Vanadium groups of blessing patterns",
		Long:     "Command groups creates and manages Vanadium groups of blessing patterns.",
		Children: []*cmdline.Command{cmdCreate, cmdDelete, cmdAdd, cmdRemove, cmdRelate, cmdGet},
	}
)

func init() {
	cmdCreate.Flags.StringVar(&flagPermFile, "permissions", "", "Path to a permissions file")
	cmdDelete.Flags.StringVar(&flagVersion, "version", "", "Identifies group version")
	cmdAdd.Flags.StringVar(&flagVersion, "version", "", "Identifies group version")
	cmdRemove.Flags.StringVar(&flagVersion, "version", "", "Identifies group version")
	cmdRelate.Flags.StringVar(&flagVersion, "version", "", "Identifies group version")
	cmdRelate.Flags.StringVar(&flagApproximation, "approximation", "under",
		"Identifies the type of approximation to use; supported values = (under, over)",
	)
}

func main() {
	cmdline.HideGlobalFlagsExcept()
	cmdline.Main(cmdRoot)
}
