/*
 * 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 HOSTNAME:
                HostNameTlv hostNameTlv = new HostNameTlv(tlvHeader);
                hostNameTlv.readFrom(channelBuffer);
                isisTlv = hostNameTlv;
                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;
    }
}