/*
 * 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.yangutils.translator.tojava.utils;

import org.onosproject.yangutils.datamodel.InvalidOpTypeHolder;
import org.onosproject.yangutils.datamodel.YangAtomicPath;
import org.onosproject.yangutils.datamodel.YangAugment;
import org.onosproject.yangutils.datamodel.YangLeafRef;
import org.onosproject.yangutils.datamodel.YangNode;
import org.onosproject.yangutils.datamodel.YangNodeIdentifier;
import org.onosproject.yangutils.datamodel.YangType;
import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
import org.onosproject.yangutils.translator.exception.TranslatorException;
import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer;
import org.onosproject.yangutils.translator.tojava.JavaFileInfoTranslator;
import org.onosproject.yangutils.translator.tojava.JavaImportData;
import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator;
import org.onosproject.yangutils.translator.tojava.TempJavaBeanFragmentFiles;
import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
import org.onosproject.yangutils.translator.tojava.TempJavaEnumerationFragmentFiles;
import org.onosproject.yangutils.translator.tojava.TempJavaEventFragmentFiles;
import org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles;
import org.onosproject.yangutils.translator.tojava.TempJavaServiceFragmentFiles;
import org.onosproject.yangutils.translator.tojava.TempJavaTypeFragmentFiles;
import org.onosproject.yangutils.utils.io.YangPluginConfig;
import org.onosproject.yangutils.utils.io.impl.CopyrightHeader;
import org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_CLASS_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_INTERFACE_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.DEFAULT_CLASS_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_ENUM_CLASS;
import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_EVENT_CLASS;
import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_EVENT_LISTENER_INTERFACE;
import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_EVENT_SUBJECT_CLASS;
import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_IDENTITY_CLASS;
import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_KEY_CLASS;
import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_SERVICE_AND_MANAGER;
import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_TYPEDEF_CLASS;
import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_UNION_CLASS;
import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.INTERFACE_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ADD_TO_LIST_IMPL_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ADD_TO_LIST_INTERFACE_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ATTRIBUTES_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.CONSTRUCTOR_FOR_TYPE_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.CONSTRUCTOR_IMPL_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EDIT_CONTENT_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ENUM_IMPL_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EQUALS_IMPL_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EVENT_ENUM_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EVENT_METHOD_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EVENT_SUBJECT_ATTRIBUTE_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EVENT_SUBJECT_GETTER_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EVENT_SUBJECT_SETTER_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.FILTER_CONTENT_MATCH_FOR_LEAF_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.FILTER_CONTENT_MATCH_FOR_NODES_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.FROM_STRING_IMPL_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.GETTER_FOR_CLASS_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.GETTER_FOR_INTERFACE_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.HASH_CODE_IMPL_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.LEAF_IDENTIFIER_ENUM_ATTRIBUTES_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.OF_STRING_IMPL_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.RPC_INTERFACE_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.SETTER_FOR_CLASS_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.SETTER_FOR_INTERFACE_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.TO_STRING_IMPL_MASK;
import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator.getQualifiedTypeInfoOfCurNode;
import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.getNodesPackage;
import static org.onosproject.yangutils.translator.tojava.utils.ClassDefinitionGenerator.generateClassDefinition;
import static org.onosproject.yangutils.utils.UtilConstants.AUGMENTED;
import static org.onosproject.yangutils.utils.UtilConstants.ERROR_MSG_FOR_GEN_CODE;
import static org.onosproject.yangutils.utils.UtilConstants.LEAFREF;
import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
import static org.onosproject.yangutils.utils.UtilConstants.OP_PARAM;
import static org.onosproject.yangutils.utils.UtilConstants.PACKAGE;
import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
import static org.onosproject.yangutils.utils.UtilConstants.SEMI_COLON;
import static org.onosproject.yangutils.utils.UtilConstants.SET_METHOD_PREFIX;
import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
import static org.onosproject.yangutils.utils.UtilConstants.SPACE;
import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.BUILDER_CLASS;
import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.BUILDER_INTERFACE;
import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.DEFAULT_CLASS;
import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.ENUM_CLASS;
import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.EVENT;
import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.EVENT_LISTENER;
import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.EVENT_SUBJECT_CLASS;
import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.INTERFACE;
import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.RPC_INTERFACE;
import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc;
import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase;
import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getJavaPackageFromPackagePath;
import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.insertDataIntoJavaFile;
import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.parsePkg;

/**
 * Represents utilities for java file generator.
 */
public final class JavaFileGeneratorUtils {

    /**
     * Creates an instance of java file generator util.
     */
    private JavaFileGeneratorUtils() {
    }

    /**
     * Returns a file object for generated file.
     *
     * @param filePath  file package path
     * @param fileName  file name
     * @param extension file extension
     * @param handler   cached file handle
     * @return file object
     */
    public static File getFileObject(String filePath, String fileName,
                                     String extension,
                                     JavaFileInfoTranslator handler) {
        return new File(handler.getBaseCodeGenPath() + filePath + SLASH +
                                fileName + extension);
    }

    /**
     * Returns data stored in temporary files.
     *
     * @param tempFiles  temporary file types
     * @param tempHandle temp java fragment files
     * @param path       absolute path
     * @return data stored in temporary files
     * @throws IOException when failed to get the data from temporary file handle
     */
    static String getDataFromTempFileHandle(
            int tempFiles, TempJavaFragmentFiles tempHandle, String path)
            throws IOException {

        TempJavaTypeFragmentFiles typeHandle = null;
        if (tempHandle instanceof TempJavaTypeFragmentFiles) {
            typeHandle = (TempJavaTypeFragmentFiles) tempHandle;
        }

        TempJavaBeanFragmentFiles beanHandle = null;
        if (tempHandle instanceof TempJavaBeanFragmentFiles) {
            beanHandle = (TempJavaBeanFragmentFiles) tempHandle;
        }

        TempJavaServiceFragmentFiles serviceHandle = null;
        if (tempHandle instanceof TempJavaServiceFragmentFiles) {
            serviceHandle = (TempJavaServiceFragmentFiles) tempHandle;
        }

        TempJavaEventFragmentFiles eventHandle = null;
        if (tempHandle instanceof TempJavaEventFragmentFiles) {
            eventHandle = (TempJavaEventFragmentFiles) tempHandle;
        }

        if ((tempFiles & ATTRIBUTES_MASK) != 0) {
            return tempHandle.getTemporaryDataFromFileHandle(
                    tempHandle.getAttributesTempFileHandle(),
                    path);
        }
        if ((tempFiles & GETTER_FOR_INTERFACE_MASK) != 0) {
            return tempHandle.getTemporaryDataFromFileHandle(
                    tempHandle.getGetterInterfaceTempFileHandle(),
                    path);
        }
        if ((tempFiles & SETTER_FOR_INTERFACE_MASK) != 0) {
            return tempHandle.getTemporaryDataFromFileHandle(
                    tempHandle.getSetterInterfaceTempFileHandle(),
                    path);
        }
        if ((tempFiles & GETTER_FOR_CLASS_MASK) != 0) {
            return tempHandle.getTemporaryDataFromFileHandle(
                    tempHandle.getGetterImplTempFileHandle(),
                    path);
        }
        if ((tempFiles & SETTER_FOR_CLASS_MASK) != 0) {
            return tempHandle.getTemporaryDataFromFileHandle(
                    tempHandle.getSetterImplTempFileHandle(),
                    path);
        }
        if ((tempFiles & ADD_TO_LIST_INTERFACE_MASK) != 0) {
            return tempHandle.getTemporaryDataFromFileHandle(
                    tempHandle.getAddToListInterfaceTempFileHandle(),
                    path);
        }
        if ((tempFiles & ADD_TO_LIST_IMPL_MASK) != 0) {
            return tempHandle.getTemporaryDataFromFileHandle(
                    tempHandle.getAddToListImplTempFileHandle(),
                    path);
        }
        if ((tempFiles & FILTER_CONTENT_MATCH_FOR_LEAF_MASK) != 0) {
            return tempHandle.getTemporaryDataFromFileHandle(
                    tempHandle.getSubtreeFilteringForLeafTempFileHandle(),
                    path);
        }
        if ((tempFiles & FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK) != 0) {
            return tempHandle.getTemporaryDataFromFileHandle(
                    tempHandle.getGetSubtreeFilteringForListTempFileHandle(),
                    path);
        }
        if ((tempFiles & FILTER_CONTENT_MATCH_FOR_NODES_MASK) != 0) {
            return tempHandle.getTemporaryDataFromFileHandle(
                    tempHandle.getGetSubtreeFilteringForChildNodeTempFileHandle(),
                    path);
        }
        if ((tempFiles & EDIT_CONTENT_MASK) != 0) {
            return tempHandle.getTemporaryDataFromFileHandle(
                    tempHandle.getEditContentTempFileHandle(),
                    path);
        }
        if ((tempFiles & LEAF_IDENTIFIER_ENUM_ATTRIBUTES_MASK) != 0) {
            return tempHandle.getTemporaryDataFromFileHandle(
                    tempHandle.getLeafIdAttributeTempFileHandle(),
                    path);
        }
        if ((tempFiles & CONSTRUCTOR_IMPL_MASK) != 0) {
            if (beanHandle == null) {
                throw new TranslatorException("Required constructor info is" +
                                                      " missing.");
            }
            return beanHandle.getTemporaryDataFromFileHandle(
                    beanHandle.getConstructorImplTempFileHandle(),
                    path);
        }
        if ((tempFiles & HASH_CODE_IMPL_MASK) != 0) {
            return tempHandle.getTemporaryDataFromFileHandle(
                    tempHandle.getHashCodeImplTempFileHandle(),
                    path);
        }
        if ((tempFiles & EQUALS_IMPL_MASK) != 0) {
            return tempHandle.getTemporaryDataFromFileHandle(
                    tempHandle.getEqualsImplTempFileHandle(),
                    path);
        }
        if ((tempFiles & TO_STRING_IMPL_MASK) != 0) {
            return tempHandle.getTemporaryDataFromFileHandle(
                    tempHandle.getToStringImplTempFileHandle(),
                    path);
        }
        if ((tempFiles & OF_STRING_IMPL_MASK) != 0) {
            if (typeHandle == null) {
                throw new TranslatorException("Required of string implementation" +
                                                      " info is missing.");
            }
            return typeHandle.getTemporaryDataFromFileHandle(
                    typeHandle.getOfStringImplTempFileHandle(), path);
        }
        if ((tempFiles & CONSTRUCTOR_FOR_TYPE_MASK) != 0) {
            if (typeHandle == null) {
                throw new TranslatorException("Required constructor implementation" +
                                                      " info is missing.");
            }
            return typeHandle.getTemporaryDataFromFileHandle(
                    typeHandle.getConstructorForTypeTempFileHandle(),
                    path);
        }
        if ((tempFiles & FROM_STRING_IMPL_MASK) != 0) {
            return tempHandle.getTemporaryDataFromFileHandle(
                    tempHandle.getFromStringImplTempFileHandle(),
                    path);
        }
        if ((tempFiles & ENUM_IMPL_MASK) != 0) {
            if (!(tempHandle instanceof TempJavaEnumerationFragmentFiles)) {
                throw new TranslatorException("Required enum info is missing.");
            }
            TempJavaEnumerationFragmentFiles enumHandle =
                    (TempJavaEnumerationFragmentFiles) tempHandle;
            return enumHandle.getTemporaryDataFromFileHandle(
                    enumHandle.getEnumClassTempFileHandle(), path);
        }
        if ((tempFiles & RPC_INTERFACE_MASK) != 0) {
            if (serviceHandle == null) {
                throw new TranslatorException("Required rpc interface info is" +
                                                      " missing.");
            }
            return serviceHandle.getTemporaryDataFromFileHandle(
                    serviceHandle.getRpcInterfaceTempFileHandle(),
                    path);
        }
        if ((tempFiles & EVENT_ENUM_MASK) != 0) {
            if (eventHandle == null) {
                throw new TranslatorException(
                        "Required event enum implementation info is missing.");
            }
            return eventHandle.getTemporaryDataFromFileHandle(
                    eventHandle.getEventEnumTempFileHandle(),
                    path);
        }
        if ((tempFiles & EVENT_METHOD_MASK) != 0) {
            if (eventHandle == null) {
                throw new TranslatorException(
                        "Required event method implementation info is missing.");
            }
            return eventHandle.getTemporaryDataFromFileHandle(
                    eventHandle.getEventMethodTempFileHandle(),
                    path);
        }
        if ((tempFiles & EVENT_SUBJECT_GETTER_MASK) != 0) {
            if (eventHandle == null) {
                throw new TranslatorException(
                        "Required event subject getter implementation info is" +
                                " missing.");
            }
            return eventHandle.getTemporaryDataFromFileHandle(
                    eventHandle.getEventSubjectGetterTempFileHandle(),
                    path);
        }
        if ((tempFiles & EVENT_SUBJECT_SETTER_MASK) != 0) {
            if (eventHandle == null) {
                throw new TranslatorException(
                        "Required event subject setter implementation info is" +
                                " missing.");
            }
            return eventHandle.getTemporaryDataFromFileHandle(
                    eventHandle.getEventSubjectSetterTempFileHandle(),
                    path);
        }
        if ((tempFiles & EVENT_SUBJECT_ATTRIBUTE_MASK) != 0) {
            if (eventHandle == null) {
                throw new TranslatorException(
                        "Required event subject attribute implementation info is" +
                                " missing.");
            }
            return eventHandle.getTemporaryDataFromFileHandle(
                    eventHandle.getEventSubjectAttributeTempFileHandle(),
                    path);
        }
        return null;
    }

    /**
     * Initiates generation of file based on generated file type.
     *
     * @param file      generated file
     * @param className generated file class name
     * @param genType   generated file type
     * @param imports   imports for the file
     * @param pkg       generated file package
     * @throws IOException when fails to generate a file
     */
    public static void initiateJavaFileGeneration(File file, String className,
                                                  int genType, List<String> imports,
                                                  String pkg)
            throws IOException {

        if (file.exists()) {
            throw new IOException(" file " + file.getName() + " is already generated." +
                                          ERROR_MSG_FOR_GEN_CODE);
        }

        boolean isFileCreated;
        try {
            isFileCreated = file.createNewFile();
            if (!isFileCreated) {
                throw new IOException("Failed to create " + file.getName() +
                                              " class file.");
            }
            appendContents(file, className, genType, imports, pkg);
        } catch (IOException e) {
            throw new IOException("Failed to append contents in " + file.getName() +
                                          " class file.");
        }
    }

    /**
     * Initiates generation of file based on generated file type.
     *
     * @param file    generated file
     * @param genType generated file type
     * @param imports imports for the file
     * @param curNode current YANG node
     * @param name    class name
     * @throws IOException when fails to generate a file
     */
    public static void initiateJavaFileGeneration(File file, int genType,
                                                  List<String> imports,
                                                  YangNode curNode, String name)
            throws IOException {

        if (file.exists()) {
            throw new IOException(" file " + file.getName() + " is already generated." +
                                          ERROR_MSG_FOR_GEN_CODE);
        }
        boolean isFileCreated;
        try {
            isFileCreated = file.createNewFile();
            if (!isFileCreated) {
                throw new IOException("Failed to create " + file.getName() +
                                              " class file.");
            }
            appendContents(file, genType, imports, curNode, name);
        } catch (IOException e) {
            throw new IOException("Failed to append contents in " + file.getName() +
                                          " class file.");
        }
    }

    /**
     * Appends all the contents into a generated java file.
     *
     * @param file        generated file
     * @param genType     generated file type
     * @param importsList list of java imports
     * @param curNode     current YANG node
     * @param className   class name
     * @throws IOException when fails to do IO operations
     */
    private static void appendContents(File file, int genType,
                                       List<String> importsList, YangNode curNode,
                                       String className)
            throws IOException {

        JavaFileInfoTranslator javaFileInfo = ((JavaFileInfoContainer) curNode)
                .getJavaFileInfo();

        String name = javaFileInfo.getJavaName();
        String path = javaFileInfo.getBaseCodeGenPath() + javaFileInfo
                .getPackageFilePath();

        String pkgString;
        if (genType == GENERATE_EVENT_CLASS ||
                genType == GENERATE_EVENT_LISTENER_INTERFACE ||
                genType == GENERATE_EVENT_SUBJECT_CLASS) {
            pkgString = parsePackageString((path + PERIOD + name)
                                                   .toLowerCase(), importsList);
        } else {
            pkgString = parsePackageString(path, importsList);
        }
        switch (genType) {
            case INTERFACE_MASK:
                appendHeaderContents(file, pkgString, importsList);
                write(file, genType, INTERFACE, curNode, className, false);
                break;
            case GENERATE_KEY_CLASS:
                appendHeaderContents(file, pkgString, importsList);
                write(file, genType, DEFAULT_CLASS, curNode, className, false);
                break;
            case DEFAULT_CLASS_MASK:
                appendHeaderContents(file, pkgString, importsList);
                write(file, genType, DEFAULT_CLASS, curNode, className,
                      curNode.isOpTypeReq());
                break;
            case BUILDER_CLASS_MASK:
                write(file, genType, BUILDER_CLASS, curNode, className, false);
                break;
            case BUILDER_INTERFACE_MASK:
                write(file, genType, BUILDER_INTERFACE, curNode, className, false);
                break;
            case GENERATE_SERVICE_AND_MANAGER:
                appendHeaderContents(file, pkgString, importsList);
                write(file, genType, RPC_INTERFACE, curNode, className, false);
                break;
            case GENERATE_EVENT_CLASS:
                appendHeaderContents(file, pkgString, importsList);
                write(file, genType, EVENT, curNode, className, false);
                break;
            case GENERATE_EVENT_LISTENER_INTERFACE:
                appendHeaderContents(file, pkgString, importsList);
                write(file, genType, EVENT_LISTENER, curNode, className, false);
                break;
            case GENERATE_EVENT_SUBJECT_CLASS:
                appendHeaderContents(file, pkgString, importsList);
                write(file, genType, EVENT_SUBJECT_CLASS, curNode, className, false);
                break;
            case GENERATE_IDENTITY_CLASS:
                appendHeaderContents(file, pkgString, importsList);
                write(file, genType, EVENT_SUBJECT_CLASS, curNode, className, false);
                break;
            default:
                break;
        }
    }

    /**
     * Appends all the contents into a generated java file.
     *
     * @param file        generated file
     * @param fileName    generated file name
     * @param genType     generated file type
     * @param importsList list of java imports
     * @param pkg         generated file package
     * @throws IOException when fails to append contents
     */
    private static void appendContents(File file, String fileName, int genType,
                                       List<String> importsList, String pkg)
            throws IOException {

        String pkgString = parsePackageString(pkg, importsList);

        switch (genType) {
            case GENERATE_TYPEDEF_CLASS:
                appendHeaderContents(file, pkgString, importsList);
                write(file, fileName, genType, DEFAULT_CLASS);
                break;
            case GENERATE_UNION_CLASS:
                appendHeaderContents(file, pkgString, importsList);
                write(file, fileName, genType, DEFAULT_CLASS);
                break;
            case GENERATE_ENUM_CLASS:
                appendHeaderContents(file, pkgString, importsList);
                write(file, fileName, genType, ENUM_CLASS);
                break;
            default:
                break;
        }
    }

    /**
     * Removes base directory path from package and generates package string for file.
     *
     * @param javaPkg     generated java package
     * @param importsList list of imports
     * @return package string
     */
    private static String parsePackageString(String javaPkg,
                                             List<String> importsList) {

        javaPkg = parsePkg(getJavaPackageFromPackagePath(javaPkg));
        if (importsList != null) {
            if (!importsList.isEmpty()) {
                return PACKAGE + SPACE + javaPkg + SEMI_COLON + NEW_LINE;
            } else {
                return PACKAGE + SPACE + javaPkg + SEMI_COLON;
            }
        } else {
            return PACKAGE + SPACE + javaPkg + SEMI_COLON;
        }
    }

    /**
     * Appends other contents to interface, impl and typedef classes.
     * for example : ONOS copyright, imports and package.
     *
     * @param file        generated file
     * @param pkg         generated package
     * @param importsList list of imports
     * @throws IOException when fails to append contents
     */
    private static void appendHeaderContents(File file, String pkg,
                                             List<String> importsList)
            throws IOException {

        insertDataIntoJavaFile(file, CopyrightHeader.parseCopyrightHeader());
        insertDataIntoJavaFile(file, pkg);

        /*
         * TODO: add the file header using comments for snippet of yang file.
         * JavaCodeSnippetGen.getFileHeaderComment
         */

        if (importsList != null) {
            insertDataIntoJavaFile(file, NEW_LINE);
            for (String imports : importsList) {
                insertDataIntoJavaFile(file, imports);
            }
        }
    }

    /**
     * Writes data to the specific generated file.
     *
     * @param file        generated file
     * @param genType     generated file type
     * @param javaDocType java doc type
     * @param curNode     current YANG node
     * @param fileName    file name
     * @param isForClass  is for default class
     * @throws IOException when fails to write into a file
     */
    private static void write(File file, int genType, JavaDocType javaDocType,
                              YangNode curNode, String fileName, boolean isForClass)
            throws IOException {
        insertDataIntoJavaFile(file, getJavaDoc(javaDocType, fileName,
                                                isForClass, null));
        insertDataIntoJavaFile(file, generateClassDefinition(genType,
                                                             fileName, curNode));
    }

    /**
     * Writes data to the specific generated file.
     *
     * @param file        generated file
     * @param fileName    file name
     * @param genType     generated file type
     * @param javaDocType java doc type
     * @throws IOException when fails to write into a file
     */
    private static void write(File file, String fileName, int genType,
                              JavaDocType javaDocType) throws IOException {
        insertDataIntoJavaFile(file, getJavaDoc(javaDocType, fileName, false,
                                                null));
        insertDataIntoJavaFile(file, generateClassDefinition(genType, fileName));
    }

    /**
     * Returns set of node identifiers.
     *
     * @param parent parent node
     * @return set of node identifiers
     */
    static List<YangAtomicPath> getSetOfNodeIdentifiers(YangNode parent) {

        List<YangAtomicPath> targets = new ArrayList<>();
        YangNodeIdentifier nodeId;
        List<YangAugment> augments = getListOfAugments(parent);
        for (YangAugment augment : augments) {
            nodeId = augment.getTargetNode().get(0).getNodeIdentifier();
            augment.setSetterMethodName(getAugmentSetterName(augment));
            if (validateNodeIdentifierInSet(nodeId, targets)) {
                targets.add(augment.getTargetNode().get(0));
            }
        }
        return targets;
    }

    /* Returns list of augments.*/
    private static List<YangAugment> getListOfAugments(YangNode parent) {
        List<YangAugment> augments = new ArrayList<>();
        YangNode child = parent.getChild();
        while (child != null) {
            if (child instanceof YangAugment) {
                augments.add((YangAugment) child);
            }
            child = child.getNextSibling();
        }
        return augments;
    }

    /* Returns setter method name for augment.*/
    private static String getAugmentSetterName(YangAugment augment) {
        YangAtomicPath atomicPath = augment.getTargetNode().get(0);
        YangNode augmentedNode = atomicPath.getResolvedNode();
        String setterName = SET_METHOD_PREFIX + AUGMENTED
                + getCapitalCase(((JavaFileInfoContainer) augmentedNode.getParent())
                                         .getJavaFileInfo().getJavaName())
                + getCapitalCase(((JavaFileInfoContainer) augmentedNode)
                                         .getJavaFileInfo().getJavaName());
        return setterName;
    }

    /*Validates the set for duplicate names of node identifiers.*/
    private static boolean validateNodeIdentifierInSet(
            YangNodeIdentifier nodeId, List<YangAtomicPath> targets) {
        boolean isPresent = true;
        for (YangAtomicPath target : targets) {
            if (target.getNodeIdentifier().getName().equals(nodeId.getName())) {
                if (target.getNodeIdentifier().getPrefix() != null) {
                    isPresent = !target.getNodeIdentifier().getPrefix()
                            .equals(nodeId.getPrefix());
                } else {
                    isPresent = nodeId.getPrefix() != null;
                }
            }
        }
        return isPresent;
    }

    /**
     * Adds resolved augmented node imports to manager class.
     *
     * @param parent parent node
     */
    public static void addResolvedAugmentedDataNodeImports(YangNode parent) {
        List<YangAtomicPath> targets = getSetOfNodeIdentifiers(parent);
        if (targets.isEmpty()) {
            return;
        }

        YangNode node = targets.get(0).getResolvedNode();
        if (node instanceof InvalidOpTypeHolder) {
            return;
        }

        TempJavaCodeFragmentFiles tempJavaCodeFragmentFiles = (
                (JavaCodeGeneratorInfo) parent)
                .getTempJavaCodeFragmentFiles();
        YangNode augmentedNode;
        JavaQualifiedTypeInfoTranslator typeInfo;
        String curNodeName;
        JavaFileInfoTranslator parentInfo = ((JavaFileInfoContainer) parent)
                .getJavaFileInfo();
        for (YangAtomicPath nodeId : targets) {
            augmentedNode = nodeId.getResolvedNode().getParent();
            curNodeName = getCurNodeName(augmentedNode, parentInfo
                    .getPluginConfig());

            typeInfo =
                    getQTypeInfoOfNode(
                            augmentedNode, curNodeName + OP_PARAM,
                            parentInfo.getPluginConfig());

            tempJavaCodeFragmentFiles.getServiceTempFiles()
                    .getJavaImportData().addImportInfo(
                    typeInfo, parentInfo.getJavaName(),
                    parentInfo.getPackage());
            typeInfo =
                    getQTypeInfoOfNode(
                            augmentedNode, curNodeName, parentInfo
                                    .getPluginConfig());

            tempJavaCodeFragmentFiles.getServiceTempFiles()
                    .getJavaImportData().addImportInfo(
                    typeInfo, parentInfo.getJavaName(),
                    parentInfo.getPackage());
        }
    }

    /**
     * Returns qualified type info of augmented node.
     *
     * @param augmentedNode augmented node
     * @param curNodeName   current node name
     * @param pluginConfig  plugin configurations
     * @return qualified type info of augmented node
     */
    private static JavaQualifiedTypeInfoTranslator getQTypeInfoOfNode(
            YangNode augmentedNode, String curNodeName, YangPluginConfig pluginConfig) {
        JavaQualifiedTypeInfoTranslator javaQualifiedTypeInfo =
                getQualifiedTypeInfoOfCurNode(augmentedNode,
                                              curNodeName);
        if (javaQualifiedTypeInfo.getPkgInfo() == null) {
            javaQualifiedTypeInfo.setPkgInfo(getNodesPackage(augmentedNode,
                                                             pluginConfig));
        }
        return javaQualifiedTypeInfo;
    }

    /**
     * Validates if augmented node is imported in parent node.
     *
     * @param javaQualifiedTypeInfo qualified type info
     * @param importData            import data
     * @return true if present in imports
     */
    private static boolean validateQualifiedInfoOfAugmentedNode(
            JavaQualifiedTypeInfoTranslator javaQualifiedTypeInfo,
            JavaImportData importData) {
        for (JavaQualifiedTypeInfoTranslator curImportInfo : importData
                .getImportSet()) {
            if (curImportInfo.getClassInfo()
                    .contentEquals(javaQualifiedTypeInfo.getClassInfo())) {
                return curImportInfo.getPkgInfo()
                        .contentEquals(javaQualifiedTypeInfo.getPkgInfo());
            }
        }
        return true;
    }

    /**
     * Return augmented class name for data methods in manager and service.
     *
     * @param augmentedNode augmented node
     * @param parent        parent node
     * @return augmented class name for data methods in manager and service
     */
    static String getAugmentedClassNameForDataMethods(YangNode augmentedNode,
                                                      YangNode parent) {
        String curNodeName;
        JavaQualifiedTypeInfoTranslator javaQualifiedTypeInfo;
        JavaFileInfoTranslator parentInfo = ((JavaFileInfoContainer) parent)
                .getJavaFileInfo();
        YangPluginConfig pluginConfig = parentInfo.getPluginConfig();
        TempJavaServiceFragmentFiles tempJavaServiceFragmentFiles = (
                (JavaCodeGeneratorInfo) parent).getTempJavaCodeFragmentFiles()
                .getServiceTempFiles();
        curNodeName = getCurNodeName(augmentedNode, pluginConfig);

        javaQualifiedTypeInfo = getQTypeInfoOfNode(augmentedNode,
                                                   getCapitalCase(curNodeName),
                                                   parentInfo.getPluginConfig());
        if (validateQualifiedInfoOfAugmentedNode(javaQualifiedTypeInfo,
                                                 tempJavaServiceFragmentFiles
                                                         .getJavaImportData())) {
            return javaQualifiedTypeInfo.getClassInfo();
        } else {
            return javaQualifiedTypeInfo.getPkgInfo() + PERIOD +
                    javaQualifiedTypeInfo.getClassInfo();
        }
    }

    //Returns class name of current node
    static String getCurNodeName(YangNode node, YangPluginConfig config) {
        if (((JavaFileInfoContainer) node).getJavaFileInfo()
                .getJavaName() != null) {
            return getCapitalCase(((JavaFileInfoContainer) node)
                                          .getJavaFileInfo()
                                          .getJavaName());
        } else {
            return getCapitalCase(getCamelCase(node.getName(), config
                    .getConflictResolver()));
        }
    }

    /**
     * Checks if the type name is leafref and returns the effective type name.
     *
     * @param attributeName name of the current type
     * @param attributeType effective type
     * @return name of the effective type
     */
    public static String isTypeNameLeafref(String attributeName,
                                           YangType<?> attributeType) {
        if (attributeName.equalsIgnoreCase(LEAFREF)) {
            YangLeafRef leafRef = (YangLeafRef) attributeType.getDataTypeExtendedInfo();
            if (leafRef != null && !leafRef.isInGrouping()) {
                return attributeType.getDataTypeName();
            }
        }
        return attributeName;
        // TODO handle union scenario, having multiple leafref.
    }

    /**
     * Checks if the type is leafref and returns the effective type.
     *
     * @param attributeType current type
     * @return effective type
     */
    public static YangType isTypeLeafref(YangType<?> attributeType) {
        if (attributeType.getDataType() == YangDataTypes.LEAFREF) {
            YangLeafRef leafRef = (YangLeafRef) attributeType
                    .getDataTypeExtendedInfo();
            if (!leafRef.isInGrouping()) {
                return leafRef.getEffectiveDataType();
            }
        }
        return attributeType;
    }

}