package lnwire

import "github.com/btcsuite/btcd/chaincfg/chainhash"

// AnnounceSignatures is an interface that represents a message used to
// exchange signatures of a ChannelAnnouncment message during the funding flow.
type AnnounceSignatures interface {
	// SCID returns the ShortChannelID of the channel.
	SCID() ShortChannelID

	// ChanID returns the ChannelID identifying the channel.
	ChanID() ChannelID

	Message
}

// ChannelAnnouncement is an interface that must be satisfied by any message
// used to announce and prove the existence of a channel.
type ChannelAnnouncement interface {
	// SCID returns the short channel ID of the channel.
	SCID() ShortChannelID

	// GetChainHash returns the hash of the chain which this channel's
	// funding transaction is confirmed in.
	GetChainHash() chainhash.Hash

	// Node1KeyBytes returns the bytes representing the public key of node
	// 1 in the channel.
	Node1KeyBytes() [33]byte

	// Node2KeyBytes returns the bytes representing the public key of node
	// 2 in the channel.
	Node2KeyBytes() [33]byte

	Message
}

// CompareResult represents the result after comparing two things.
type CompareResult uint8

const (
	// LessThan indicates that base object is less than the object it was
	// compared to.
	LessThan CompareResult = iota

	// EqualTo indicates that the base object is equal to the object it was
	// compared to.
	EqualTo

	// GreaterThan indicates that base object is greater than the object it
	// was compared to.
	GreaterThan
)

// ChannelUpdate is an interface that describes a message used to update the
// forwarding rules of a channel.
type ChannelUpdate interface {
	// SCID returns the ShortChannelID of the channel that the update
	// applies to.
	SCID() ShortChannelID

	// IsNode1 is true if the update was produced by node 1 of the channel
	// peers. Node 1 is the node with the lexicographically smaller public
	// key.
	IsNode1() bool

	// IsDisabled is true if the update is announcing that the channel
	// should be considered disabled.
	IsDisabled() bool

	// GetChainHash returns the hash of the chain that the message is
	// referring to.
	GetChainHash() chainhash.Hash

	// ForwardingPolicy returns the set of forwarding constraints of the
	// update.
	ForwardingPolicy() *ForwardingPolicy

	// CmpAge can be used to determine if the update is older or newer than
	// the passed update. It returns LessThan if this update is older than
	// the passed update, GreaterThan if it is newer and EqualTo if they are
	// the same age.
	CmpAge(update ChannelUpdate) (CompareResult, error)

	// SetDisabledFlag can be used to adjust the disabled flag of an update.
	SetDisabledFlag(bool)

	// SetSCID can be used to overwrite the SCID of the update.
	SetSCID(scid ShortChannelID)

	Message
}

// ForwardingPolicy defines the set of forwarding constraints advertised in a
// ChannelUpdate message.
type ForwardingPolicy struct {
	// TimeLockDelta is the minimum number of blocks that the node requires
	// to be added to the expiry of HTLCs. This is a security parameter
	// determined by the node operator. This value represents the required
	// gap between the time locks of the incoming and outgoing HTLC's set
	// to this node.
	TimeLockDelta uint16

	// BaseFee is the base fee that must be used for incoming HTLC's to
	// this particular channel. This value will be tacked onto the required
	// for a payment independent of the size of the payment.
	BaseFee MilliSatoshi

	// FeeRate is the fee rate that will be charged per millionth of a
	// satoshi.
	FeeRate MilliSatoshi

	// HtlcMinimumMsat is the minimum HTLC value which will be accepted.
	MinHTLC MilliSatoshi

	// HasMaxHTLC is true if the MaxHTLC field is provided in the update.
	HasMaxHTLC bool

	// HtlcMaximumMsat is the maximum HTLC value which will be accepted.
	MaxHTLC MilliSatoshi
}