// 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.MasterCollections)
	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()
}
