/*
 * 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.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;

/**
 * Provides the license header for the generated files.
 */
public final class CopyrightHeader {

    private static final int EOF = -1;
    private static final String COPYRIGHT_HEADER_FILE = "CopyrightHeader.txt";
    private static final String TEMP_FILE = "temp.txt";
    private static ClassLoader classLoader = CopyrightHeader.class.getClassLoader();

    private static String copyrightHeader;

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

    /**
     * Returns copyright file header.
     *
     * @return copyright file header
     * @throws IOException when fails to parse copyright header
     */
    public static String getCopyrightHeader() throws IOException {

        if (copyrightHeader == null) {
            parseCopyrightHeader();
        }
        return copyrightHeader;
    }

    /**
     * Sets the copyright header.
     *
     * @param header copyright header
     */
    private static void setCopyrightHeader(String header) {

        copyrightHeader = header;
    }

    /**
     * parse Copyright to the temporary file.
     *
     * @throws IOException when fails to get the copyright header
     */
    public static void parseCopyrightHeader() throws IOException {

        File temp = new File(TEMP_FILE);

        try {
            InputStream stream = classLoader.getResourceAsStream(COPYRIGHT_HEADER_FILE);
            OutputStream out = new FileOutputStream(temp);

            int index;
            while ((index = stream.read()) != EOF) {
                out.write(index);
            }
            out.close();
            stream.close();
            getStringFileContent(temp);
            setCopyrightHeader(getStringFileContent(temp));
        } catch (IOException e) {
            throw new IOException("failed to parse the Copyright header");
        } finally {
            temp.delete();
        }
    }

    /**
     * Converts it to string.
     *
     * @param toAppend file to be converted.
     * @return string of file.
     * @throws IOException when fails to convert to string
     */
    private static String getStringFileContent(File toAppend) throws IOException {

        FileReader fileReader = new FileReader(toAppend);
        BufferedReader bufferReader = new BufferedReader(fileReader);
        try {
            StringBuilder stringBuilder = new StringBuilder();
            String line = bufferReader.readLine();

            while (line != null) {
                stringBuilder.append(line);
                stringBuilder.append(NEW_LINE);
                line = bufferReader.readLine();
            }
            return stringBuilder.toString();
        } finally {
            fileReader.close();
            bufferReader.close();
        }
    }
}
