// 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/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.
// TODO(hpucha): Rename this type.
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.

	// Id of the object that was updated. This id is relative to Application
	// and Database names and is the store key for a particular row in a
	// table.
	ObjId      string
	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.
	PermId     string    // id of the permissions object controlling this version.
	PermVers   string    // current version of the permissions object.
	Shell      bool      // true when the mutation data is hidden due to permissions.
	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.
// TODO(hpucha): Make this a string since now the syncgroup id is an object 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.
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 a request to sync either data or syncgroup metadata for a
// Database.
type DeltaReq union {
	Sgs  SgDeltaReq
	Data DataDeltaReq
}

// DataDeltaReq contains the initiator's genvector and the set of syncgroups it
// is interested in within a Database (specified by the AppName/DbName) when
// requesting deltas for that Database.
type DataDeltaReq struct {
	AppName string
	DbName  string
	SgIds   set[GroupId]
	InitVec GenVector
}

// SgDeltaReq contains the initiator's genvector for the syncgroups it is
// interested in within a Database (specified by the AppName/DbName) when
// requesting deltas for those syncgroups.
type SgDeltaReq struct {
	AppName string
	DbName  string
	InitVec GenVector // Contains a genvector per syncgroup.
}

// 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 {
	Rec     LogRec
	RespVec GenVector
}

// ChunkHash contains the hash of a chunk that is part of a blob's recipe.
type ChunkHash struct {
	Hash []byte
}

// ChunkData contains the data of a chunk.
type ChunkData struct {
	Data []byte
}

// TimeReq contains the send timestamp from the requester.
type TimeReq struct {
	SendTs time.Time
}

// TimeResp contains timestamps needed by the requester to correctly estimate
// the difference between the two clocks along with clock metadata required
// by the requester to decide which clock is more accurate.
type TimeResp struct {
	// The send timestamp received in TimeReq from the originator.
	OrigTs time.Time

	// Time when the request was received.
	RecvTs time.Time

	// Time when the response was sent.
	SendTs time.Time

	// Timestamp received from NTP during last NTP sync. The last NTP sync could
	// be done either by this device or some other device that this device
	// synced its clock with.
	LastNtpTs ?time.Time

	// Number of reboots since last NTP sync.
	NumReboots uint16

	// Number of hops between this device and the device that did the last
	// NTP sync.
	NumHops uint16
}
