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

// Client methods for stream configuration.

package client

import (
	"fmt"

	"v.io/v23/context"
	nosql_wire "v.io/v23/services/syncbase/nosql"
	"v.io/v23/syncbase/nosql"
	"v.io/v23/verror"
	"v.io/x/sensorlog_lite/internal/sbmodel"
	"v.io/x/sensorlog_lite/internal/sbmodel/keyutil"
)

// CreateStream writes the configuration for a new sampling stream to Syncbase.
// The target device must have been configured. streamId must be unique for
// the target device.
// TODO(ivanpi): Add actual sampling script.
func CreateStream(ctx *context.T, db nosql.Database, devKey *sbmodel.KDeviceCfg, streamId, desc string) (*sbmodel.KStreamDef, error) {
	if err := keyutil.ValidateId(streamId); err != nil {
		return nil, fmt.Errorf("invalid streamId: %v", err)
	}
	stmKey := sbmodel.KStreamDef{
		DevId:    devKey.DevId,
		StreamId: streamId,
	}
	if desc == "" {
		desc = "stream:" + stmKey.Key()
	}
	stmVal := sbmodel.VStreamDef{
		Desc:    desc,
		Enabled: true,
	}

	if err := nosql.RunInBatch(ctx, db, nosql_wire.BatchOptions{}, func(db nosql.BatchDatabase) error {
		devRow := db.Table(devKey.Table()).Row(devKey.Key())
		stmRow := db.Table(stmKey.Table()).Row(stmKey.Key())

		if exists, err := devRow.Exists(ctx); err != nil {
			return err
		} else if !exists {
			return verror.New(verror.ErrNoExist, ctx, "Device '"+devKey.Key()+"' does not exist")
		}

		if exists, err := stmRow.Exists(ctx); err != nil {
			return err
		} else if exists {
			return verror.New(verror.ErrExist, ctx, "Stream '"+stmKey.Key()+"' already exists")
		}

		return stmRow.Put(ctx, stmVal)
	}); err != nil {
		return nil, err
	}

	return &stmKey, nil
}

// TODO(ivanpi): Implement pausing and resuming streams.
