package zpay32

import "github.com/btcsuite/btcd/btcec/v2"

const (
	// DefaultAssumedFinalCLTVDelta is the default value to be used as the
	// final CLTV delta for a route if one is unspecified in the payment
	// request.
	// We adhere to the recommendation in BOLT 02 for terminal payments.
	// See also:
	// https://github.com/lightning/bolts/blob/master/02-peer-protocol.md
	DefaultAssumedFinalCLTVDelta = 18
)

// HopHint is a routing hint that contains the minimum information of a channel
// required for an intermediate hop in a route to forward the payment to the
// next. This should be ideally used for private channels, since they are not
// publicly advertised to the network for routing.
type HopHint struct {
	// NodeID is the public key of the node at the start of the channel.
	NodeID *btcec.PublicKey

	// ChannelID is the unique identifier of the channel.
	ChannelID uint64

	// FeeBaseMSat is the base fee of the channel in millisatoshis.
	FeeBaseMSat uint32

	// FeeProportionalMillionths is the fee rate, in millionths of a
	// satoshi, for every satoshi sent through the channel.
	FeeProportionalMillionths uint32

	// CLTVExpiryDelta is the time-lock delta of the channel.
	CLTVExpiryDelta uint16
}

// Copy returns a deep copy of the hop hint.
func (h HopHint) Copy() HopHint {
	nodeID := *h.NodeID
	return HopHint{
		NodeID:                    &nodeID,
		ChannelID:                 h.ChannelID,
		FeeBaseMSat:               h.FeeBaseMSat,
		FeeProportionalMillionths: h.FeeProportionalMillionths,
		CLTVExpiryDelta:           h.CLTVExpiryDelta,
	}
}