package net.kwmt27.codesearch.util;

import android.util.Log;

import net.kwmt27.codesearch.BuildConfig;


/**
 * ロガークラス
 * <p/>
 * <p>デバッグビルドとリリースビルドでログ出力有無を切り替える。<br/>
 * デバッグビルドではログ出力し、リリースビルドではログ出力しない</p>
 */
public class Logger {

    private static final Boolean DEBUG = BuildConfig.DEBUG;

    /**
     * DEBUGログを出力する。
     *
     * @param msg
     */
    public static void d(String msg) {
        if (DEBUG) {
            Log.d(Logger.getLogTagWithMethod(), msg);
        }
    }

    /**
     * ERRORログを出力する。
     *
     * @param msg
     */
    public static void e(String msg) {
        if (DEBUG) {
            Log.e(Logger.getLogTagWithMethod(), msg);
        }
    }

    /**
     * ERRORログとExceptionを出力する。
     *
     * @param msg
     * @param tr
     */
    public static void e(String msg, Throwable tr) {
        if (DEBUG) {
            Log.e(Logger.getLogTagWithMethod(), msg, tr);
        }
    }

    /**
     * ERROR Exceptionを出力する。
     *
     * @param tr
     */
    public static void e(Throwable tr) {
        if (DEBUG) {
            Log.e(Logger.getLogTagWithMethod(), tr.getMessage(), tr);
        }
    }

    /**
     * INFOログを出力する。
     *
     * @param msg
     */
    public static void i(String msg) {
        if (DEBUG) {
            Log.i(Logger.getLogTagWithMethod(), msg);
        }
    }

    /**
     * VERBOSEログを出力する。
     *
     * @param msg
     */
    public static void v(String msg) {
        if (DEBUG) {
            Log.v(Logger.getLogTagWithMethod(), msg);
        }
    }

    /**
     * WARNログを出力する。
     *
     * @param msg
     */
    public static void w(String msg) {
        if (DEBUG) {
            Log.w(Logger.getLogTagWithMethod(), msg);
        }
    }

    /**
     * WARNログとExceptionを出力する。
     *
     * @param msg
     * @param tr
     */
    public static void w(String msg, Throwable tr) {
        if (DEBUG) {
            Log.w(Logger.getLogTagWithMethod(), msg, tr);
        }
    }

    /**
     * @return 実行されたクラス名・メソッド・行番号を取得する
     */
    private static String getLogTagWithMethod() {
        Throwable stack = new Throwable().fillInStackTrace();
        StackTraceElement[] trace = stack.getStackTrace();
        return trace[2].getClassName() + "." + trace[2].getMethodName() + ":" + trace[2].getLineNumber();
    }
}

@@ -2285,11 +2285,378 @@
 );%0A    %7D
+%0A%0A    public static void methodOnly() %7B%0A        if(DEBUG) %7B%0A            d(getMethodName());%0A        %7D%0A    %7D%0A    private static String getMethodName() %7B%0A        Throwable stack = new Throwable().fillInStackTrace();%0A        StackTraceElement%5B%5D trace = stack.getStackTrace();%0A        return trace%5B2%5D.getClassName() + %22.%22 + trace%5B2%5D.getMethodName() + %22 is called.%22;%0A    %7D
 %0A%7D%0A

add methodOnly method