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

// Implements PersistentDataKey for each K<T> type, as described in types.vdl.

package sbmodel

import (
	"v.io/x/sensorlog_lite/internal/sbmodel/keyutil"
)

// PersistentDataKey is a type encapsulating data from the row key of a
// top-level value type persisted to Syncbase.
type PersistentDataKey interface {
	// Table returns the name of the Syncbase table for the data type.
	Table() string
	// Key returns the row key for the value.
	Key() string
	// Parse parses the row key for the value into self. Returns an error if key
	// is malformed.
	Parse(key string) error
}

// devicecfg : <DevId>
func (_ KDeviceCfg) Table() string { return "devicecfg" }
func (k *KDeviceCfg) Key() string  { return keyutil.Join(k.DevId) }
func (k *KDeviceCfg) Parse(key string) error {
	parts, err := keyutil.Split(key, 1)
	if err != nil {
		return err
	}
	k.DevId = parts[0]
	return nil
}

// streamdef : <DevId>/<StreamId>
func (_ KStreamDef) Table() string { return "streamdef" }
func (k *KStreamDef) Key() string  { return keyutil.Join(k.DevId, k.StreamId) }
func (k *KStreamDef) Parse(key string) error {
	parts, err := keyutil.Split(key, 2)
	if err != nil {
		return err
	}
	k.DevId, k.StreamId = parts[0], parts[1]
	return nil
}

// TableSpec defines a Syncbase table, encapsulating a key prototype and
// permissions.
type TableSpec struct {
	Prototype PersistentDataKey
	ReadOnly  bool
}

// All top-level types persisted to master device Syncbase.
var MasterTables = []TableSpec{
	{Prototype: &KDeviceCfg{}},
	{Prototype: &KStreamDef{}},
}

// All top-level types persisted to measured Syncbase.
var MeasuredTables = []TableSpec{
	{Prototype: &KStreamDef{}, ReadOnly: true},
}
