/*
 * 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.yms.app.ych.defaultcodecs;


import org.onosproject.yms.app.ych.YchException;
import org.onosproject.yms.app.ych.defaultcodecs.xml.XmlCodecHandler;
import org.onosproject.yms.app.ych.defaultcodecs.xml.XmlCodecMultiInstanceHandler;
import org.onosproject.yms.app.ych.defaultcodecs.xml.XmlCodecMultiInstanceLeafHandler;
import org.onosproject.yms.app.ych.defaultcodecs.xml.XmlCodecSingleInstanceHandler;
import org.onosproject.yms.app.ych.defaultcodecs.xml.XmlCodecSingleInstanceLeafHandler;
import org.onosproject.yms.ych.YangProtocolEncodingFormat;
import org.onosproject.yms.ydt.YdtContext;
import org.onosproject.yms.ydt.YdtType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashMap;
import java.util.Map;

import static org.onosproject.yms.ych.YangProtocolEncodingFormat.XML;
import static org.onosproject.yms.ydt.YdtType.MULTI_INSTANCE_LEAF_VALUE_NODE;
import static org.onosproject.yms.ydt.YdtType.MULTI_INSTANCE_NODE;
import static org.onosproject.yms.ydt.YdtType.SINGLE_INSTANCE_LEAF_VALUE_NODE;
import static org.onosproject.yms.ydt.YdtType.SINGLE_INSTANCE_NODE;

/**
 * Represents an YCH handle factory to create different types of YANG data tree
 * node.
 */
public final class CodecHandlerFactory {

    private static final Logger log =
            LoggerFactory.getLogger(CodecHandlerFactory.class);
    private static final String YDT_TYPE_ERROR = "YDT type is not supported.";

    /**
     * Map of xml codec handler.
     */
    private final Map<YdtType, XmlCodecHandler> handlerMap;

    /**
     * Creates a new codec handler factory.
     */
    private CodecHandlerFactory() {
        handlerMap = new HashMap<>();
        handlerMap.put(SINGLE_INSTANCE_NODE,
                       new XmlCodecSingleInstanceHandler());
        handlerMap.put(MULTI_INSTANCE_NODE,
                       new XmlCodecMultiInstanceHandler());
        handlerMap.put(SINGLE_INSTANCE_LEAF_VALUE_NODE,
                       new XmlCodecSingleInstanceLeafHandler());
        handlerMap.put(MULTI_INSTANCE_LEAF_VALUE_NODE,
                       new XmlCodecMultiInstanceLeafHandler());
    }

    /**
     * Returns YCH instance handler node instance.
     *
     * @param node   YDT context node
     * @param format data format type expected from driver
     * @return returns YCH handler node instance
     */
    public XmlCodecHandler getCodecHandlerForContext(
            YdtContext node,
            YangProtocolEncodingFormat format) {
        if (format == XML) {
            XmlCodecHandler handler = handlerMap.get(node.getYdtType());
            if (handler == null) {
                throw new YchException(YDT_TYPE_ERROR + node.getYdtType());
            }
            return handler;
        }
        log.error("{} data format is not supported.", format);
        return null;
    }

    /*
     * Bill Pugh Singleton pattern. INSTANCE won't be instantiated until the
     * LazyHolder class is loaded via a call to the instance() method below.
     */
    private static class LazyHolder {
        private static final CodecHandlerFactory INSTANCE =
                new CodecHandlerFactory();
    }

    /**
     * Returns a reference to the Singleton Codec Handler factory.
     *
     * @return the singleton codec handler factory
     */
    public static CodecHandlerFactory instance() {
        return LazyHolder.INSTANCE;
    }
}
