/*
 * Copyright 2018-2024 Open Networking Foundation (ONF) and the ONF Contributors

 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at

 * http://www.apache.org/licenses/LICENSE-2.0

 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package igmp

import (
	"encoding/hex"
	"fmt"
	"net"
	"testing"

	"github.com/google/gopacket"
	"github.com/google/gopacket/layers"
	"github.com/opencord/voltha-protos/v5/go/openolt"
	"github.com/stretchr/testify/assert"
	"google.golang.org/grpc"
)

type mockStream struct {
	CallCount int
	Calls     map[int]*openolt.Indication
	grpc.ServerStream
}

func (s *mockStream) Send(ind *openolt.Indication) error {
	s.CallCount++
	s.Calls[s.CallCount] = ind
	return nil
}

func TestHandleNextPacket(t *testing.T) {

	t.Skip("Need to find how to serialize an IGMP packet")

	stream := &mockStream{
		CallCount: 0,
		Calls:     make(map[int]*openolt.Indication),
	}

	mac := net.HardwareAddr{0x2e, 0x60, 0x70, 0x13, 0x15, 0x16}

	packetData := []byte{
		1, 0, 94, 0, 0, 22, 222, 173, 190, 239, 186, 17, 8, 0, 70, 0, 0, 32, 0, 0, 0, 0, 120, 2, 191,
		215, 10, 244, 2, 246, 224, 0, 0, 22, 148, 4, 0, 0, 17, 10, 14, 223, 224, 0, 0, 22, 0, 0, 0, 0,
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	}
	fmt.Println(hex.EncodeToString(packetData))

	packet := gopacket.NewPacket(packetData, layers.LayerTypeIPv4, gopacket.Default)

	fmt.Println(hex.EncodeToString(packet.Data()))

	fmt.Println(packet.Layers())

	err := HandleNextPacket(0, 0, "FOO", 1, 1024, 0, mac, packet, 55, 5, nil, stream)
	assert.Nil(t, err)

	assert.Equal(t, 1, stream.CallCount)
}
