/*
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

package com.mrousavy.blurhash;

import android.util.Log;
import com.facebook.common.logging.FLog;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.common.ReactConstants;

// See: https://github.com/facebook/react-native/blob/52b3105f652eca72892f200923e1687f1d995486/ReactAndroid/src/main/java/com/facebook/react/util/RNLog.java
/** Logging wrapper for FLog with LogBox support. */
public class RNLog {
    public static final int MINIMUM_LEVEL_FOR_UI = Log.WARN;

    public static final int LOG = Log.VERBOSE;

    public static final int TRACE = Log.DEBUG;

    public static final int ADVICE = Log.INFO;

    public static final int WARN = Log.WARN;

    public static final int ERROR = Log.ERROR;

    /**
     * Log a log level message tagged as React Native to the console.
     *
     * @param message The message to log.
     */
    public static void l(String message) {
        FLog.i(ReactConstants.TAG, message);
    }

    /**
     * Log a trace level message tagged as React Native to the console.
     *
     * @param message The message to log.
     */
    public static void t(String message) {
        FLog.i(ReactConstants.TAG, message);
    }

    /**
     * Log a warning level message tagged as React Native to the console. This warning will not be
     * shown in LogBox.
     *
     * @param message The message to log.
     */
    public static void a(String message) {
        FLog.w(ReactConstants.TAG, "(ADVICE)" + message);
    }

    /**
     * Log a warning level message tagged as React Native to the console and display in the app.
     *
     * @param context The React context of the application use to display the warning.
     * @param message The message to log.
     */
    public static void w(ReactContext context, String message) {
        RNLog.logInternal(context, message, WARN);
        FLog.w(ReactConstants.TAG, message);
    }

    /**
     * Log an error level message tagged as React Native to the console and display in the app.
     *
     * @param context The React context of the application use to display the error.
     * @param message The message to log.
     */
    public static void e(ReactContext context, String message) {
        RNLog.logInternal(context, message, ERROR);
        FLog.e(ReactConstants.TAG, message);
    }

    /**
     * Log an error level message tagged as React Native to the console. This error will not be shown
     * in LogBox.
     *
     * @param message The message to log.
     */
    public static void e(String message) {
        FLog.e(ReactConstants.TAG, message);
    }

    private static void logInternal(ReactContext context, String message, int level) {
        if (level >= MINIMUM_LEVEL_FOR_UI) {
            if (context != null && message != null) {
                context.getJSModule(RCTLog.class).logIfNoNativeHook(levelToString(level), message);
            }
        }
    }

    private static String levelToString(int level) {
        switch (level) {
            case LOG:
            case TRACE:
            {
                return "log";
            }
            case ADVICE:
            case WARN:
            {
                return "warn";
            }
            case ERROR:
            {
                return "error";
            }
            default:
            {
                return "none";
            }
        }
    }
}