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

import org.onosproject.yangutils.datamodel.YangSchemaNode;
import org.onosproject.yms.app.ynh.YangNotificationExtendedService;

/**
 * Abstraction of entity which provides interfaces to YANG schema registry.
 */
public interface YangSchemaRegistry {

    /**
     * Registers applications to YMS.
     *
     * @param managerObject               application's object
     * @param serviceClass                service class which needs to be
     *                                    registered
     * @param notificationExtendedService notification extended service to
     *                                    register application object with YNH
     */
    void registerApplication(Object managerObject, Class<?> serviceClass,
                             YangNotificationExtendedService
                                     notificationExtendedService);

    /**
     * Unregisters applications to YMS.
     *
     * @param managerObject application's object
     * @param serviceClass  service class which needs to be unregistered
     */
    void unRegisterApplication(Object managerObject, Class<?> serviceClass);

    /**
     * Returns application's implementation's class object.
     *
     * @param yangSchemaNode application's schema node
     * @return application's implementation's class object
     */
    Object getRegisteredApplication(YangSchemaNode yangSchemaNode);

    /**
     * Returns YANG schema node using schema name.
     *
     * @param schemaName module name.
     * @return YANG schema node using schema name
     */
    YangSchemaNode getYangSchemaNodeUsingSchemaName(String schemaName);

    /**
     * Returns YANG schema nodes using application name.
     *
     * @param appName application's service name
     * @return YANG schema nodes using application name
     */
    YangSchemaNode getYangSchemaNodeUsingAppName(String appName);

    /**
     * Returns YANG schema nodes using root interface file name.
     *
     * @param rootInterfaceFileName name of generated interface file
     *                              for root node
     * @return YANG schema nodes using root interface file name
     */
    YangSchemaNode
    getYangSchemaNodeUsingGeneratedRootNodeInterfaceFileName(
            String rootInterfaceFileName);

    /**
     * Returns YANG schema nodes using root op param file name.
     *
     * @param rootOpParamFileName name of generated op param file for root node
     * @return YANG schema nodes using root op param file name
     */
    YangSchemaNode
    getYangSchemaNodeUsingGeneratedRootNodeOpPramFileName(
            String rootOpParamFileName);

    /**
     * Returns YANG schema node of root for notifications.
     *
     * @param eventSubject event subject
     * @return YANG schema node of root for notifications
     */
    YangSchemaNode getRootYangSchemaNodeForNotification(String eventSubject);

    /**
     * Returns registered service class.
     *
     * @param schemaNode YANG schema node
     * @param appName    application's name
     * @return registered service class
     */
    Class<?> getRegisteredClass(YangSchemaNode schemaNode, String appName);

}
