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

// sdata : <DevId>/<StreamId>/<Timestamp>
func (k KDataPoint) Table() string {
	return "sdata"
}
func (k *KDataPoint) Key() string {
	return keyutil.Join(k.DevId, k.StreamId, keyutil.StringifyTime(k.Timestamp))
}
func (k *KDataPoint) Parse(key string) error {
	parts, err := keyutil.Split(key, 3)
	if err != nil {
		return err
	}
	timestamp, err := keyutil.ParseTime(parts[2])
	if err != nil {
		return err
	}
	k.DevId, k.StreamId, k.Timestamp = parts[0], parts[1], timestamp
	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{}},
	{Prototype: &KDataPoint{}},
}

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