// 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(devKey.Key())
	devRow := db.CollectionForId(sbmodel.CollectionId(devKey)).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}
	sgId := wire.Id{Name: devSgName, Blessing: "blessing"}
	if _, err := db.SyncgroupForId(sgId).Join(ctx, sgPublishSb, "", sgMemberInfo); err != nil {
		return nil, err
	}

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