package com.accelbyte.blackbox;

import android.util.Log;

public class AndroidHandler implements Thread.UncaughtExceptionHandler
{
	// exception type
	public static final int EC_CRASH = 0;
	public static final int EC_EXCEPTION = EC_CRASH + 1;
	public static final int EC_ASSERT = EC_EXCEPTION + 1;
	
	private Thread.UncaughtExceptionHandler DefaultHandler;
	private static AndroidHandler sInstance;
	private AndroidHandler()
	{
		this.DefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
	}
	
	public static AndroidHandler GetInstance()
	{
		if(sInstance == null)
		{
			sInstance = new AndroidHandler();
		}
		return sInstance;
	}
	
	public static final String PLUGIN_NAME_BLACKBOX_CORE = "blackbox-core";
	
	static
	{
		System.loadLibrary(PLUGIN_NAME_BLACKBOX_CORE);
	}
	
	public static void InitializeJavaExceptionHandler()
	{
		Log.e("BLACKBOX-JAVA", "Initalize java exception handler");
		Thread.setDefaultUncaughtExceptionHandler(GetInstance());
	}
	
	@Override
	public void uncaughtException(Thread thread, Throwable throwable)
	{
		Log.e("BLACKBOX-JAVA", "Processing java exception");
		int exceptionType = (throwable instanceof AssertionError) ? EC_ASSERT : EC_EXCEPTION;
		String stackTrace = GetStackTrace(throwable);
		processStackTrace(stackTrace, exceptionType);
	}
	
	private static String GetStackTrace(Throwable throwable)
	{
		StringBuilder result = new StringBuilder();
		for (StackTraceElement e : throwable.getStackTrace())
		{
			result.append(e.toString()).append("\n");
		}
		return result.toString();
	}
	
	private static native void processStackTrace(String stack_trace, int error);
}