/*
 * Copyright 2016 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.utils.io.impl;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.util.List;

/**
 * Provides storage for serialized data while traversing data model tree for code generation.
 */
public final class SerializedDataStore {

    /**
     * Data Store types.
     */
    public static enum SerializedDataStoreType {

        /**
         * Methods.
         */
        INTERFACE_METHODS,

        /**
         * Methods.
         */
        BUILDER_METHODS,

        /**
         * Methods.
         */
        BUILDER_INTERFACE_METHODS,

        /**
         * Methods.
         */
        IMPL_METHODS,

        /**
         * Attributes.
         */
        ATTRIBUTE,

        /**
         * Imports.
         */
        IMPORT
    }

    /**
     * File name string for serialized files of methods.
     */
    private static final String INTERFACE_METHOD_FILE_NAME = "SerializedInterfaceMethodDataStore";

    /**
     * File name string for serialized files of methods.
     */
    private static final String BUILDER_METHOD_FILE_NAME = "SerializedBuilderMethodDataStore";

    /**
     * File name string for serialized files of methods.
     */
    private static final String BUILDER_INTERFACE_METHOD_FILE_NAME = "SerializedBuilderInterfaceMethodDataStore";

    /**
     * File name string for serialized files of methods.
     */
    private static final String IMPL_METHOD_FILE_NAME = "SerializedImplMethodDataStore";

    /**
     * File name string for serialized files of attributes.
     */
    private static final String ATTRIBUTE_FILE_NAME = "SerializedAttributeDataStore";

    /**
     * File name string for serialized files of imports.
     */
    private static final String IMPORT_FILE_NAME = "SerializedImportDataStore";

    /**
     * File extension of serialized files.
     */
    private static final String SERIALIZE_FILE_EXTENSION = ".ser";

    /**
     * Buffer size.
     */
    private static final int BUFFER_SIZE = 8 * 1024;

    /**
     * Default constructor.
     */
    private SerializedDataStore() {
    }

    /**
     * Writes specific info to a serialized file.
     *
     * @param data data to be stored
     * @param type type of serialized data store
     * @throws IOException when fails to create a serialized data file.
     */
    public static void setSerializeData(String data, SerializedDataStoreType type) throws IOException {

        String fileName = "";
        if (type.equals(SerializedDataStoreType.ATTRIBUTE)) {
            fileName = ATTRIBUTE_FILE_NAME;
        } else if (type.equals(SerializedDataStoreType.INTERFACE_METHODS)) {
            fileName = INTERFACE_METHOD_FILE_NAME;
        } else if (type.equals(SerializedDataStoreType.BUILDER_INTERFACE_METHODS)) {
            fileName = BUILDER_INTERFACE_METHOD_FILE_NAME;
        } else if (type.equals(SerializedDataStoreType.BUILDER_METHODS)) {
            fileName = BUILDER_METHOD_FILE_NAME;
        } else if (type.equals(SerializedDataStoreType.IMPL_METHODS)) {
            fileName = IMPL_METHOD_FILE_NAME;
        } else if (type.equals(SerializedDataStoreType.IMPORT)) {
            fileName = IMPORT_FILE_NAME;
        } else {
            throw new IOException("Unresolved file type.");
        }

        try {
            OutputStream file = new FileOutputStream(fileName + SERIALIZE_FILE_EXTENSION);
            OutputStream buffer = new BufferedOutputStream(file, BUFFER_SIZE);

            ObjectOutput output = new ObjectOutputStream(buffer);
            try {
                output.writeObject(data);
            } finally {
                output.close();
            }
        } catch (IOException ex) {
            throw new IOException("failed to serialize data");
        }
    }

    /**
     * Get the serialized data.
     *
     * @param type type of serialized data store
     * @return list of attribute info.
     * @throws IOException when fails to read from the file.
     * @throws ClassNotFoundException when file is missing.
     */
    @SuppressWarnings("unchecked")
    public static List<String> getSerializeData(SerializedDataStoreType type)
            throws IOException, ClassNotFoundException {

        String fileName = "";
        if (type.equals(SerializedDataStoreType.ATTRIBUTE)) {
            fileName = ATTRIBUTE_FILE_NAME;
        } else if (type.equals(SerializedDataStoreType.INTERFACE_METHODS)) {
            fileName = INTERFACE_METHOD_FILE_NAME;
        } else if (type.equals(SerializedDataStoreType.BUILDER_INTERFACE_METHODS)) {
            fileName = BUILDER_INTERFACE_METHOD_FILE_NAME;
        } else if (type.equals(SerializedDataStoreType.BUILDER_METHODS)) {
            fileName = BUILDER_METHOD_FILE_NAME;
        } else if (type.equals(SerializedDataStoreType.IMPL_METHODS)) {
            fileName = IMPL_METHOD_FILE_NAME;
        } else if (type.equals(SerializedDataStoreType.IMPORT)) {
            fileName = IMPORT_FILE_NAME;
        } else {
            throw new IOException("Unresolved file type.");
        }

        try {
            InputStream file = new FileInputStream(fileName + SERIALIZE_FILE_EXTENSION);
            InputStream buffer = new BufferedInputStream(file);
            ObjectInput input = new ObjectInputStream(buffer);
            try {
                List<String> recoveredData = (List<String>) input.readObject();
                return recoveredData;
            } finally {
                input.close();
            }
        } catch (ClassNotFoundException ex) {
            throw new ClassNotFoundException("failed to fetch the serialized data file.");
        }
    }
}
