package lncfg

const (
	// DefaultHoldInvoiceExpiryDelta defines the number of blocks before the
	// expiry height of a hold invoice's htlc that lnd will automatically
	// cancel the invoice to prevent the channel from force closing. This
	// value *must* be greater than DefaultIncomingBroadcastDelta to prevent
	// force closes.
	DefaultHoldInvoiceExpiryDelta = DefaultIncomingBroadcastDelta + 2

	// DefaultMinNumRealBlindedPathHops is the minimum number of _real_
	// hops to include in a blinded payment path. This doesn't include our
	// node (the destination node), so if the minimum is 1, then the path
	// will contain at minimum our node along with an introduction node hop.
	DefaultMinNumRealBlindedPathHops = 1

	// DefaultNumBlindedPathHops is the number of hops to include in a
	// blinded payment path. If paths shorter than this number are found,
	// then dummy hops are used to pad the path to this length.
	DefaultNumBlindedPathHops = 2

	// DefaultMaxNumBlindedPaths is the maximum number of different blinded
	// payment paths to include in an invoice.
	DefaultMaxNumBlindedPaths = 3

	// DefaultBlindedPathPolicyIncreaseMultiplier is the default multiplier
	// used to increase certain blinded hop policy values in order to add
	// a probing buffer.
	DefaultBlindedPathPolicyIncreaseMultiplier = 1.1

	// DefaultBlindedPathPolicyDecreaseMultiplier is the default multiplier
	// used to decrease certain blinded hop policy values in order to add a
	// probing buffer.
	DefaultBlindedPathPolicyDecreaseMultiplier = 0.9
)

// Invoices holds the configuration options for invoices.
//
//nolint:ll
type Invoices struct {
	HoldExpiryDelta uint32 `long:"holdexpirydelta" description:"The number of blocks before a hold invoice's htlc expires that the invoice should be canceled to prevent a force close. Force closes will not be prevented if this value is not greater than DefaultIncomingBroadcastDelta."`
}

// Validate checks that the various invoice config options are sane.
//
// NOTE: this is part of the Validator interface.
func (i *Invoices) Validate() error {
	// Log a warning if our expiry delta is not greater than our incoming
	// broadcast delta. We do not fail here because this value may be set
	// to zero to intentionally keep lnd's behavior unchanged from when we
	// didn't auto-cancel these invoices.
	if i.HoldExpiryDelta <= DefaultIncomingBroadcastDelta {
		log.Warnf("Invoice hold expiry delta: %v <= incoming "+
			"delta: %v, accepted hold invoices will force close "+
			"channels if they are not canceled manually",
			i.HoldExpiryDelta, DefaultIncomingBroadcastDelta)
	}

	return nil
}