package themis

import "github.com/pingcap/go-hbase"

// LockRole is the role of lock
type LockRole int

func (l LockRole) String() string {
	if l == RolePrimary {
		return "primary"
	}
	return "secondary"
}

const (
	// RolePrimary means this row is primary
	RolePrimary LockRole = iota
	// RoleSecondary means this row is secondary
	RoleSecondary
)

type Lock interface {
	// SetCoordinate sets lock's coordinate
	SetCoordinate(c *hbase.ColumnCoordinate)
	// Coordinate returns the lock's coordinate
	Coordinate() *hbase.ColumnCoordinate
	// Timestamp returns startTs of the transction which owned this lock
	Timestamp() uint64
	// SetExpired sets the lock's expired status.
	SetExpired(b bool)
	// IsExpired returns if lock is expired.
	IsExpired() bool
	// Type returns the lock's type, Put or Delete
	Type() hbase.Type
	// Role returns LockRole, primary or secondary
	Role() LockRole
	// not used now
	Context() interface{}
	// valid only  Role == Primary
	Secondaries() []Lock
	// Primary returns the primary lock of this lock
	Primary() Lock
	// Encode encodes the lock to byte slice
	Encode() []byte
}

type LockManager interface {
	// CleanLock if clean lock success, first return value is transction's commit
	// timestamp, otherwise, the second return value is transction's primary
	// lock.
	CleanLock(c *hbase.ColumnCoordinate, prewriteTs uint64) (uint64, Lock, error)
	// EraseLockAndData removes lock and data.
	EraseLockAndData(c *hbase.ColumnCoordinate, prewriteTs uint64) error
	// GetCommitTimestamp returns a committed transction's commit timestamp.
	GetCommitTimestamp(c *hbase.ColumnCoordinate, prewriteTs uint64) (uint64, error)
	// [startTs, endTs]
	IsLockExists(c *hbase.ColumnCoordinate, startTs, endTs uint64) (bool, error)
}