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

package interfaces

import (
	"time"

	wire "v.io/syncbase/v23/services/syncbase/nosql"
)

const (
	NoGroupId = GroupId(0)
)

// TODO(hpucha): These are not final yet. This is an intermediate step.

const (
        // NodeRec type log record adds a new node in the dag.
        NodeRec = byte(0)

        // LinkRec type log record adds a new link in the dag. Link records are
        // added when a conflict is resolved by picking the local or the remote
        // version as the resolution of a conflict, instead of creating a new
        // version.
        LinkRec = byte(1)
)

// PrefixGenVector is the generation vector for a data prefix, which maps each
// device id to its last locally known generation in the scope of that prefix.
type PrefixGenVector map[uint64]uint64

// GenVector is the generation vector for a Database, and maps prefixes to their
// generation vectors. Note that the prefixes in a GenVector are relative to the
// the Application and Database name.
type GenVector map[string]PrefixGenVector

// LogRecMetadata represents the metadata of a single log record that is
// exchanged between two peers. Each log record represents a change made to an
// object in the store.
//
// TODO(hpucha): Add readset/scanset. Look into sending tx metadata only once
// per transaction.
type LogRecMetadata struct {
        // Log related information.
        Id        uint64 // device id that created the log record.
	Gen       uint64 // generation number for the log record.
	RecType   byte   // type of log record.

        // Object related information.
        ObjId       string      // id of the object that was updated. This id is relative to Application and Database names.
        CurVers     string      // current version number of the object.
        Parents     []string    // 0, 1 or 2 parent versions that the current version is derived from.
	UpdTime     time.Time   // timestamp when the update is generated.
	Delete      bool        // indicates whether the update resulted in object being deleted from the store.
	BatchId     uint64      // unique id of the Batch this update belongs to.
	BatchCount  uint64      // number of objects in the Batch.
}

// LogRec represents the on-wire representation of an entire log record: its
// metadata and data. Value is the actual value of a store object.
type LogRec struct {
	Metadata LogRecMetadata
	Value    []byte
}

// GroupId is a globally unique SyncGroup ID.
type GroupId uint64

// Possible states for a SyncGroup.
type SyncGroupStatus enum {
	// Indicates that a SyncGroup is operational, but publishing to the
	// remote server is pending.
	PublishPending

	// Indicates that the SyncGroup is operational, but the publishing
	// failed.
	PublishRejected

	// Indicates that the SyncGroup is operational and published.
	Running
}

// SyncGroup contains the state of a SyncGroup object.
type SyncGroup struct {
	Id          GroupId                             // globally unique identifier generated by Syncbase
	Name        string                              // globally unique Vanadium name chosen by app
	SpecVersion string                              // version on SyncGroup spec for concurrency control
	Spec        wire.SyncGroupSpec                  // app-given specification
	Creator     string                              // Creator's Vanadium name
	AppName     string                              // Globally unique App name
	DbName      string                              // Database name within the App
	Status      SyncGroupStatus                     // Status of the SyncGroup
	Joiners     map[string]wire.SyncGroupMemberInfo // map of joiners to their metadata
}

// DeltaReq contains the initiator's genvector and the set of SyncGroups it is
// interested with in a Database when requesting deltas for that Database.
type DeltaReq struct {
	SgIds   set[GroupId]
	InitVec GenVector
}

// DeltaResp contains the responder's genvector or the missing log records
// returned in response to an initiator's request for deltas for a Database.
type DeltaResp union {
	Start   bool
	Finish  bool
	Rec     LogRec
	RespVec GenVector
}
