/*
 * Copyright 2015 Open Networking Laboratory
 *
 * 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 org.onlab.packet;

import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;

/**
 * A class to represent Groups for membership query and reports.
 */
public abstract class IGMPGroup {

    protected int auxInfo;
    protected IpAddress gaddr;
    protected List<IpAddress> sources = new ArrayList<>();

    public IGMPGroup() {
    }

    /**
     * Initialize this object with a multicast group address and additional info.
     *
     * @param gaddr the multicast group address for this message type.
     * @param auxInfo additional info potentially used by IGMPQuery
     */
    public IGMPGroup(IpAddress gaddr, int auxInfo) {
        this.gaddr = gaddr;
        this.auxInfo = auxInfo;
    }

    /**
     * Get the multicast group address.
     *
     * @return the group address
     */
    public IpAddress getGaddr() {
        return this.gaddr;
    }

    /**
     * Get the auxillary info.
     *
     * @return the auxillary info
     */
    public int getAuxInfo() {
        return this.auxInfo;
    }

    /**
     * Add a unicast source address to this message.
     *
     * @param saddr IPv4 unicast source address
     */
    public void addSource(IpAddress saddr) {
        sources.add(saddr);
    }

    /**
     * Return the list of source addresses.
     *
     * @return list of source addresses
     */
    public List<IpAddress> getSources() {
        return sources;
    }

    /**
     * Deserialize an IGMPQuery or IGMPMembership message.
     *
     * @param bb the ByteBuffer wrapping the serialized message.  The position of the
     *           ByteBuffer should be pointing at the head of either message type.
     * @return An object populated with the respective IGMPGroup subclass
     * @throws DeserializationException in case deserialization goes wrong
     */
    public abstract IGMPGroup deserialize(ByteBuffer bb) throws DeserializationException;

    /**
     * Serialize the IGMPGroup subclass.
     *
     * @param bb the ByteBuffer to write into, positioned at the next spot to be written to.
     * @return The serialized message
     */
    public abstract byte[] serialize(ByteBuffer bb);

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        sb.append("auxInfo= ");
        sb.append(auxInfo);
        sb.append("gaddr= ");
        sb.append(gaddr);
        sb.append("sources= ");
        sb.append(sources.toString());
        sb.append("]");
        return sb.toString();
    }
}
