package org.wordpress.android.util;

import com.crashlytics.android.Crashlytics;

import io.fabric.sdk.android.Fabric;

public class CrashlyticsUtils {
    final private static String EXCEPTION_KEY = "exception";
    final private static String TAG_KEY = "tag";
    final private static String MESSAGE_KEY = "message";
    public enum ExceptionType {USUAL, SPECIFIC}
    public enum ExtraKey {IMAGE_ANGLE, IMAGE_WIDTH, IMAGE_HEIGHT, IMAGE_RESIZE_SCALE, NOTE_HTMLDATA, ENTERED_URL}

    public static void logException(Throwable tr, ExceptionType exceptionType, AppLog.T tag, String message) {
        if (!Fabric.isInitialized()) {
            return;
        }
        if (tag != null) {
            Crashlytics.setString(TAG_KEY, tag.name());
        }
        if (message != null) {
            Crashlytics.setString(MESSAGE_KEY, message);
        }
        Crashlytics.setString(EXCEPTION_KEY, exceptionType.name());
        Crashlytics.logException(tr);
    }

    public static void logException(Throwable tr, ExceptionType exceptionType, AppLog.T tag) {
        logException(tr, exceptionType, tag, null);
    }

    public static void logException(Throwable tr, ExceptionType exceptionType) {
        logException(tr, exceptionType, null, null);
    }

    // Utility functions to force us to use and reuse a limited set of keys

    public static void setInt(ExtraKey key, int value) {
        if (!Fabric.isInitialized()) {
            return;
        }
        Crashlytics.setInt(key.name(), value);
    }

    public static void setFloat(ExtraKey key, float value) {
        if (!Fabric.isInitialized()) {
            return;
        }
        Crashlytics.setFloat(key.name(), value);
    }

    public static void setString(ExtraKey key, String value) {
        if (!Fabric.isInitialized()) {
            return;
        }
        Crashlytics.setString(key.name(), value);
    }

    public static void setBool(ExtraKey key, boolean value) {
        if (!Fabric.isInitialized()) {
            return;
        }
        Crashlytics.setBool(key.name(), value);
    }
}
