package nodes

import (
	"sync"
	"time"

	"github.com/syndtr/goleveldb/leveldb"
)

type State = uint8

const (
	Follower State = iota + 1
	Candidate
	Leader
)

type Node struct {
	Mu    sync.Mutex
	MuElection sync.Mutex
	// 当前节点id
	SelfId string
	// 记录的leader(不能用votedfor：投票的leader可能没有收到多数票)
	LeaderId string

	// 除当前节点外其他节点id
	Nodes []string

	// 当前节点状态
	State State

	// 任期
	CurrTerm int

	// 简单的kv存储
	Log []RaftLogEntry

	// leader用来标记新log, = log.len
	MaxLogId int

	// 已提交的index
	CommitIndex int

	// 最后应用（写到db）的index
	LastApplied int	

	// 需要发送给每个节点的下一个索引
	NextIndex map[string]int

	// 已经发送给每个节点的最大索引
	MatchIndex map[string]int

	// 存kv（模拟状态机）
	Db *leveldb.DB
	// 持久化节点数据（currterm votedfor log）
	Storage *RaftStorage

	VotedFor string
	ElectionTimer *time.Timer

	// 通信方式
	Transport Transport

	// 系统的随机时间
	RTTable *RandomTimeTable

	// 已经处理过的客户端请求
	SeenRequests map[LogEntryCallId]bool

	IsFinish bool
}

