package com.ryuunoakaihitomi.rebootmenu.csc_compat;

import android.content.Context;
import android.os.Build;
import android.util.Log;

import com.crashlytics.android.Crashlytics;
import com.ryuunoakaihitomi.rebootmenu.activity.SendBugFeedback;
import com.ryuunoakaihitomi.rebootmenu.util.ConfigManager;
import com.ryuunoakaihitomi.rebootmenu.util.SpecialSupport;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.Iterator;

/**
 * 对崩溃报告组件的二次封装和处理
 * Created by ZQY on 2019/3/10.
 */

public class CrashReport {
    private static final String TAG = "CrashReport";

    private CrashReport() {
    }

    /**
     * 开始错误报告
     * 逻辑:如果自动上传配置为假,自动捕捉,否则不做处理(由Crashlytics捕捉)
     *
     * @param context {@link Context}
     * @param handler {@link java.lang.Thread.UncaughtExceptionHandler}
     */
    public static void start(Context context, Thread.UncaughtExceptionHandler handler) {
        long launchTimes = ConfigManager.getPrivateLong(context, ConfigManager.APP_LAUNCH_TIMES, 0);
        /*
         * 第一条件:用户不是一般用户 -> !(安装了酷安,是MIUI系统)
         * 第二条件:自动上报功能关闭,或条件不足以加载csc
         */
        if (!CoolapkCompat.hasCoolapk(context) && !SpecialSupport.isMIUI()) {
            if (!ConfigManager.getPrivateBoolean(context, ConfigManager.AUTO_CRASH_REPORT, false) || !MainCompat.shouldLoadCSC())
                Thread.setDefaultUncaughtExceptionHandler(handler);
        } else {
            //Firebase Crashlytics抓取的机型信息不全面,这里再手动抓一次
            try {
                JSONObject object = new JSONObject(SendBugFeedback.getRawBuildEnvInfo());
                Iterator iterator = object.keys();
                while (iterator.hasNext()) {
                    String key = (String) iterator.next();
                    Crashlytics.setString(key, object.getString(key));
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
            Crashlytics.setLong("launchTimes", launchTimes);
            //小米设备的话看看是不是原版系统
            if ("Xiaomi".equals(Build.MANUFACTURER))
                Crashlytics.setBool("isMIUI", SpecialSupport.isMIUI());
            Crashlytics.setString("serviceAvailableState", GmsApiWrapper.fetchStateString(context));
        }
        ConfigManager.setPrivateLong(context, ConfigManager.APP_LAUNCH_TIMES, ++launchTimes);
    }

    /**
     * 设置自动上传
     *
     * @param context   {@link Context}
     * @param crashInfo 包含在日志信息中的崩溃信息
     */
    public static void setAutoSendReport(Context context, String crashInfo) {
        if (!MainCompat.shouldLoadCSC()) return;
        ConfigManager.setPrivateBoolean(context, ConfigManager.AUTO_CRASH_REPORT, true);
        Crashlytics.log(Log.ERROR, TAG, "UncaughtException:" + crashInfo);
    }

    /**
     * 记录非严重异常
     *
     * @param throwable {@link Throwable}
     */
    public static void logNonFatalExceptions(Throwable throwable) {
        if (!MainCompat.shouldLoadCSC()) return;
        Crashlytics.logException(throwable);
    }

    /**
     * crash时附带的log信息
     *
     * @param tag tag
     * @param msg message
     */
    public static void log(String tag, String msg) {
        if (!MainCompat.shouldLoadCSC()) return;
        Crashlytics.log(tag + " : " + msg);
    }

    /**
     * Test exception
     */
    public static void crashEmulator(boolean type) {
        if (type) Crashlytics.getInstance().crash();
        throw new IllegalStateException("Test Exception");
    }
}