// 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 measuring device configuration.

package client

import (
	"fmt"

	"v.io/v23/context"
	wire "v.io/v23/services/syncbase"
	"v.io/v23/syncbase"
	"v.io/v23/verror"
	"v.io/x/sensorlog/internal/config"
	"v.io/x/sensorlog/internal/sbmodel"
	"v.io/x/sensorlog/internal/sbmodel/keyutil"
)

// AddDevice joins the syncgroup of the measuring device identified by devId,
// expected to be published at sgPublishSb, and makes it available for stream
// configuration.
func AddDevice(ctx *context.T, db syncbase.Database, devId, sgPublishSb, desc string) (*sbmodel.KDeviceCfg, error) {
	if err := keyutil.ValidateId(devId); err != nil {
		return nil, fmt.Errorf("invalid devId: %v", err)
	}
	devKey := sbmodel.KDeviceCfg{
		DevId: devId,
	}
	if desc == "" {
		desc = "device:" + devKey.Key()
	}
	devVal := sbmodel.VDeviceCfg{
		Desc:        desc,
		SgPublishSb: sgPublishSb,
	}
	devSgName := config.SyncgroupName(sgPublishSb, devKey.Key())
	devRow := db.Collection(devKey.Collection()).Row(devKey.Key())

	if exists, err := devRow.Exists(ctx); err != nil {
		return nil, err
	} else if exists {
		return nil, verror.New(verror.ErrExist, ctx, "Device '"+devKey.Key()+"' was already added")
	}

	// TODO(ivanpi): Lack of atomicity here can result in a duplicate join, not
	// really relevant until syncgroup Leave is implemented.
	sgMemberInfo := wire.SyncgroupMemberInfo{SyncPriority: config.SyncPriority}
	if _, err := db.Syncgroup(devSgName).Join(ctx, sgMemberInfo); err != nil {
		return nil, err
	}

	return &devKey, devRow.Put(ctx, &devVal)
}
