/*
 * Copyright 2016-present 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.onosproject.isis.io.isispacket.tlv;

import org.jboss.netty.buffer.ChannelBuffer;

/**
 * Representation of TLV Finder.
 */
public class TlvFinder extends TlvHeader {

    /**
     * Sets the value for TLV header.
     *
     * @param tlvHeader     tlvHeader
     * @param channelBuffer byteBuf
     * @return isisTlv
     */
    public static IsisTlv findTlv(TlvHeader tlvHeader, ChannelBuffer channelBuffer) {

        IsisTlv isisTlv = null;
        switch (TlvType.get(tlvHeader.tlvType())) {
            case AREAADDRESS:
                AreaAddressTlv areaAddressTlv = new AreaAddressTlv(tlvHeader);
                areaAddressTlv.readFrom(channelBuffer);
                isisTlv = areaAddressTlv;
                break;
            case AUTHENTICATION:
                //TODO
                break;
            case EXTENDEDISREACHABILITY:
                //TODO
                break;
            case IDRPINFORMATION:
                IdrpInformationTlv idrpInformationTlv = new IdrpInformationTlv(tlvHeader);
                idrpInformationTlv.readFrom(channelBuffer);
                isisTlv = idrpInformationTlv;
                break;
            case IPEXTENDEDREACHABILITY:
                IpExtendedReachabilityTlv iperTlv = new IpExtendedReachabilityTlv(tlvHeader);
                iperTlv.readFrom(channelBuffer);
                isisTlv = iperTlv;
                break;
            case IPINTERFACEADDRESS:
                IpInterfaceAddressTlv ipTlv = new IpInterfaceAddressTlv(tlvHeader);
                ipTlv.readFrom(channelBuffer);
                isisTlv = ipTlv;
                break;
            case IPINTERNALREACHABILITY:
                IpInternalReachabilityTlv iprTlv = new IpInternalReachabilityTlv(tlvHeader);
                iprTlv.readFrom(channelBuffer);
                isisTlv = iprTlv;
                break;
            case ISALIAS:
                break;
            case PROTOCOLSUPPORTED:
                ProtocolSupportedTlv psTlv = new ProtocolSupportedTlv(tlvHeader);
                psTlv.readFrom(channelBuffer);
                isisTlv = psTlv;
                break;
            case ISREACHABILITY:
                IsReachabilityTlv isrTlv = new IsReachabilityTlv(tlvHeader);
                isrTlv.readFrom(channelBuffer);
                isisTlv = isrTlv;
                break;
            case ISNEIGHBORS:
                IsisNeighborTlv isisNeighborTlv = new IsisNeighborTlv(tlvHeader);
                isisNeighborTlv.readFrom(channelBuffer);
                isisTlv = isisNeighborTlv;
                break;
            case LSPENTRY:
                LspEntriesTlv lspEntriesTlv = new LspEntriesTlv(tlvHeader);
                lspEntriesTlv.readFrom(channelBuffer);
                isisTlv = lspEntriesTlv;
                break;
            case PADDING:
                PaddingTlv paddingTlv = new PaddingTlv(tlvHeader);
                paddingTlv.readFrom(channelBuffer);
                isisTlv = paddingTlv;
                break;
            case ADJACENCYSTATE:
                AdjacencyStateTlv adjacencyStateTlv = new AdjacencyStateTlv(tlvHeader);
                adjacencyStateTlv.readFrom(channelBuffer);
                isisTlv = adjacencyStateTlv;
                break;
            default:
                break;
        }
        return isisTlv;
    }
}