package chanstate

import (
	"bytes"
	"testing"

	"github.com/btcsuite/btcd/btcec/v2"
	"github.com/lightningnetwork/lnd/lnwire"
	"github.com/lightningnetwork/lnd/tlv"
	"github.com/stretchr/testify/require"
)

// TestHTLCCopy asserts that copying an HTLC produces an independent deep copy.
func TestHTLCCopy(t *testing.T) {
	t.Parallel()

	_, blindingPoint := btcec.PrivKeyFromBytes(bytes.Repeat([]byte{1}, 32))

	var rHash [32]byte
	copy(rHash[:], bytes.Repeat([]byte{2}, len(rHash)))

	var onionBlob [lnwire.OnionPacketSize]byte
	copy(onionBlob[:], bytes.Repeat([]byte{3}, len(onionBlob)))

	htlc := HTLC{
		Signature:     []byte{4, 5, 6},
		RHash:         rHash,
		Amt:           1000,
		RefundTimeout: 144,
		OutputIndex:   3,
		Incoming:      true,
		OnionBlob:     onionBlob,
		HtlcIndex:     42,
		LogIndex:      43,
		ExtraData:     lnwire.ExtraOpaqueData{7, 8, 9},
		BlindingPoint: tlv.SomeRecordT(
			tlv.NewPrimitiveRecord[lnwire.BlindingPointTlvType](
				blindingPoint,
			),
		),
		CustomRecords: lnwire.CustomRecords{
			lnwire.MinCustomRecordsTlvType: []byte{10, 11, 12},
		},
	}

	clone := htlc.Copy()
	require.Equal(t, htlc, clone)

	clone.Signature[0] = 0
	require.Equal(t, byte(4), htlc.Signature[0])

	clone.ExtraData[0] = 0
	require.Equal(t, byte(7), htlc.ExtraData[0])

	clone.CustomRecords[lnwire.MinCustomRecordsTlvType] = []byte{0}
	require.Equal(
		t, []byte{10, 11, 12},
		htlc.CustomRecords[lnwire.MinCustomRecordsTlvType],
	)

	clone = htlc.Copy()
	clone.CustomRecords[lnwire.MinCustomRecordsTlvType][0] = 0
	require.Equal(
		t, []byte{10, 11, 12},
		htlc.CustomRecords[lnwire.MinCustomRecordsTlvType],
	)
}
