/*
 * Copyright (C) 2008 The Android Open Source Project
 *
 * 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 com.android.cts;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintStream;

/**
 * Utility class to help the CTS logging
 */
public class Log {
    private static final String INFO_PREFIX = "\nCTS_INFO >>> ";
    private static final String ERROR_PREFIX = "\nCTS_ERROR >>> ";
    private static final String DEBUG_PREFIX = "\nCTS_DEBUG >>> ";
    private static final String LOG_FNAME_PREFIX = "log_";
    private static final String LOG_FNAME_SURFIX = "_.txt";

    private static PrintStream mOut = System.err;

    private static boolean TRACE = true;
    private static BufferedWriter mTraceOutput = null;

    private static boolean LOG = true;
    private static BufferedWriter mLogOutput = null;
    private static String mLogFileName;

    /**
     * Print the message to the information stream without adding prefix.
     *
     * @param msg The message to be printed.
     */
    public static void println(final String msg) {
        log(INFO_PREFIX + msg);
        mOut.println(msg);
    }

    /**
     * Add the message to the information stream.
     *
     * @param msg the message to be added to the information stream.
     */
    public static void i(final String msg) {
        log(INFO_PREFIX + msg);

        mOut.println(INFO_PREFIX + msg);
    }

    /**
     * Add the message to the error message stream.
     * @param msg The message to be added to the error message stream.
     * @param e The exception.
     */
    public static void e(final String msg, Exception e) {
        log(ERROR_PREFIX + msg);

        if (!HostConfig.DEBUG) {
            CUIOutputStream.println(ERROR_PREFIX + msg);
            if (e != null) {
                CUIOutputStream.println(e.getMessage());
            }
            return;
        }

        mOut.println(ERROR_PREFIX + msg);
        if (e != null) {
            e.printStackTrace();
        }
    }

    /**
     * Add the message to the debugging stream.
     *
     * @param msg The message to be added to the debugging stream.
     */
    public static void d(final String msg) {
        log(DEBUG_PREFIX + System.currentTimeMillis() + " " + msg);

        if (HostConfig.DEBUG) {
            mOut.println(DEBUG_PREFIX + msg);
        }
    }

    /**
     * Set the output stream.
     *
     * @param out The output stream.
     */
    public static void setOutput(PrintStream out) {
        if (out != null) {
            mOut = out;
        }
    }

    /**
     * Reset the output stream.
     */
    public static void resetOutput() {
        mOut = System.out;
    }

    /**
     * Initialize the log stream.
     *
     * @param path The path to add the log file.
     */
    public static void initLog(String path) {
        mLogFileName = path + File.separator + LOG_FNAME_PREFIX
            + HostUtils.getFormattedTimeString(System.currentTimeMillis(), "_", ".", ".")
            + LOG_FNAME_SURFIX;
        try {
            if (mLogOutput == null) {
                mLogOutput = new BufferedWriter(new FileWriter(mLogFileName));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * Close the log stream.
     */
    public static void closeLog() {
        if (mLogOutput != null) {
            try {
                mLogOutput.close();
                mLogOutput = null;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * Log the message.
     *
     * @param msg The message to be logged.
     */
    public static void log(String msg) {
        if (LOG && (mLogOutput != null)) {
            try {
                if (msg != null) {
                    mLogOutput.write(msg + "\n");
                    mLogOutput.flush();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * Add the message to the trace stream.
     *
     * @param msg The message to be added to the trace stream.
     */
    public static void t(String msg) {
        if (TRACE) {
            try {
                if (mTraceOutput == null) {
                    mTraceOutput = new BufferedWriter(new FileWriter("debug.txt"));
                }
                if (msg != null) {
                    mTraceOutput.write(msg + "\n");
                    mTraceOutput.flush();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * Close the trace stream.
     */
    public static void closeTrace() {
        if (mTraceOutput != null) {
            try {
                mTraceOutput.close();
                mTraceOutput = null;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
