// 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 measured data listing support.

package main

import (
	"fmt"

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

var cmdSLList = &cmdline.Command{
	Runner: v23cmd.RunnerFunc(runSLList),
	Name:   "list",
	Short:  "List measured data",
	Long: `
Prints all measured data points for the given stream and device, sorted
chronologically.
`,
	ArgsName: "<device_id> <stream_id>",
	ArgsLong: `
<device_id> and <stream_id> specify the data stream to print the data points
from.
`,
}

var (
	flagFollow bool
)

func init() {
	cmdSLList.Flags.BoolVar(&flagFollow, "follow", false, "Follow updates until killed, similar to 'tail -f'.")
}

// TODO(ivanpi): Add time interval querying and aggregation functions.
func runSLList(ctx *context.T, env *cmdline.Env, args []string) error {
	if len(args) != 2 {
		return env.UsageErrorf("expects exactly 2 arguments")
	}
	streamKey := &sbmodel.KStreamDef{
		DevId:    args[0],
		StreamId: args[1],
	}

	dataPrintCb := func(key *sbmodel.KDataPoint, val sbmodel.VDataPoint) error {
		fmt.Fprintf(env.Stdout, "%s %v\n", key.Timestamp.Format(config.TimeOutputFormat), val.Interface())
		return nil
	}

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

	if !flagFollow {
		return client.ListStreamData(ctx, db, streamKey, dataPrintCb)
	}

	ctx, stop := context.WithCancel(ctx)

	waitFollow := util.AsyncRun(func() error {
		return client.FollowStreamData(ctx, db, streamKey, dataPrintCb)
	}, func(err error) {
		stop()
	})

	select {
	case <-signals.ShutdownOnSignals(nil):
		stop()
	case <-ctx.Done():
	}

	return waitFollow()
}
