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

// slcli device configuration.

package main

import (
	"fmt"

	"v.io/v23/context"
	"v.io/x/lib/cmdline"
	"v.io/x/ref/lib/v23cmd"
	"v.io/x/sensorlog/internal/client"
	"v.io/x/sensorlog/internal/sbmodel"
	"v.io/x/sensorlog/internal/sbutil"
)

var cmdSLDevice = &cmdline.Command{
	Name:  "device",
	Short: "Manage measuring devices",
	Long: `
Add measuring devices.

TODO(ivanpi): List.
`,
	Children: []*cmdline.Command{cmdSLDeviceAdd /*, cmdSLDeviceList */},
}

var cmdSLDeviceAdd = &cmdline.Command{
	Runner: v23cmd.RunnerFunc(runSLDeviceAdd),
	Name:   "add",
	Short:  "Add new measuring device",
	Long: `
Adds a new measuring device and outputs its identifier.
`,
	ArgsName: "<publish_sb> <device_id> [<device_desc>]",
	ArgsLong: `
<publish_sb> is the rooted name of the Syncbase instance where the device
             syncgroup is published.

<device_id> is the identifier of the device to add.

<device_desc> is a human-readable description of the device.
              It doesn't need to be unique.
`,
}

func runSLDeviceAdd(ctx *context.T, env *cmdline.Env, args []string) error {
	if len(args) < 2 || len(args) > 3 {
		return env.UsageErrorf("expects between 2 and 3 arguments")
	}
	sgPublishSb := args[0]
	devId := args[1]
	desc := ""
	if len(args) > 2 {
		desc = args[2]
	}

	db, err := sbutil.CreateOrOpenDB(ctx, *flagSbService, sbmodel.MasterTables)
	if err != nil {
		return fmt.Errorf("failed opening Syncbase db: %v", err)
	}

	devKey, err := client.AddDevice(ctx, db, devId, sgPublishSb, desc)
	if err != nil {
		return err
	}

	fmt.Fprintf(env.Stdout, "%s\n", devKey.DevId)

	return nil
}
