/*
 * Copyright 2015-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.bgpio.protocol;

import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.bgpio.exceptions.BgpParseException;
import org.onosproject.bgpio.protocol.ver4.BgpFactoryVer4;
import org.onosproject.bgpio.types.BgpHeader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Abstraction to provide the version for BGP.
 */
public final class BgpFactories {

    protected static final Logger log = LoggerFactory.getLogger(BgpFactories.class);

    private static final GenericReader GENERIC_READER = new GenericReader();

    private BgpFactories() {
    }

    /**
     * Returns the instance of BGP Version.
     *
     * @param version BGP version
     * @return BGP version
     */
    public static BgpFactory getFactory(BgpVersion version) {
        switch (version) {
        case BGP_4:
            return BgpFactoryVer4.INSTANCE;
        default:
            throw new IllegalArgumentException("[BgpFactory:]Unknown version: " + version);
        }
    }

    /**
     * Reader class for reading BGP messages from channel buffer.
     *
     */
    private static class GenericReader implements BgpMessageReader<BgpMessage> {

        @Override
        public BgpMessage readFrom(ChannelBuffer bb, BgpHeader bgpHeader)
                throws BgpParseException {
            BgpFactory factory;

            if (!bb.readable()) {
                log.error("Empty message received");
                throw new BgpParseException("Empty message received");
            }
            // TODO: Currently only BGP version 4 is supported
            factory = org.onosproject.bgpio.protocol.ver4.BgpFactoryVer4.INSTANCE;
            return factory.getReader().readFrom(bb, bgpHeader);
        }
    }

    /**
     * Returns BGP messsage generic reader.
     *
     * @return bgp message generic reader
     */
    public static BgpMessageReader<BgpMessage> getGenericReader() {
        return GENERIC_READER;
    }
}
