/*
 * Copyright 2016-present Open Networking Foundation
 *
 * 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:
                IsExtendedReachability isExtendedReachability =
                        new IsExtendedReachability(tlvHeader);
                isExtendedReachability.readFrom(channelBuffer);
                isisTlv = isExtendedReachability;
                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;
    }
}