package com.dji.wsbridge.lib;

import android.app.Activity;
import android.app.Application;
import android.os.Bundle;
import android.os.StrictMode;

import com.crashlytics.android.Crashlytics;
import com.dji.wsbridge.BuildConfig;
import com.squareup.otto.Bus;
import com.squareup.otto.ThreadEnforcer;

import io.fabric.sdk.android.Fabric;

public class BridgeApplication extends Application implements Application.ActivityLifecycleCallbacks {

    public static final String TAG = "APPLICATION";
    private static BridgeApplication instance;
    private final Bus eventBus = new Bus(ThreadEnforcer.ANY);

    public static BridgeApplication getInstance() {
        return instance;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        if (BuildConfig.BUILD_TYPE != "debug") {
            Fabric.with(this, new Crashlytics());
        }
        DJILogger.init();
        instance = this;
        //registerActivityLifecycleCallbacks(this);
        if (BuildConfig.DEBUG) {
            // Detect UI-Thread blockage
            //BlockCanary.install(this, new AppBlockCanaryContext()).start();
            //// Detect memory leakage
            //if (!LeakCanary.isInAnalyzerProcess(this)) {
            //    LeakCanary.install(this);
            //}
            // Detect thread violation
            StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll().penaltyDropBox().penaltyLog().build());
            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectAll()
                    .penaltyDropBox()
                    .penaltyLog()
                    .build());
        }
    }

    public Bus getBus() {
        return this.eventBus;
    }

    //region -------------------------------------- Activity Callbacks and Helpers ---------------------------------------------
    @Override
    public void onActivityCreated(Activity activity, Bundle bundle) {
        DJILogger.v(TAG, activity.getLocalClassName() + " Created");
    }

    @Override
    public void onActivityResumed(Activity activity) {
        DJILogger.v(TAG, activity.getLocalClassName() + " Resumed");
    }

    @Override
    public void onActivityDestroyed(Activity activity) {
        DJILogger.v(TAG, activity.getLocalClassName() + " Destroyed");
    }

    @Override
    public void onActivityPaused(Activity activity) {
        DJILogger.v(TAG, activity.getLocalClassName() + " Paused");
    }

    @Override
    public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
        DJILogger.v(TAG, activity.getLocalClassName() + " SaveInstance");
    }

    @Override
    public void onActivityStarted(Activity activity) {
        DJILogger.v(TAG, activity.getLocalClassName() + " Started");
    }

    @Override
    public void onActivityStopped(Activity activity) {
        DJILogger.v(TAG, activity.getLocalClassName() + " Stopped");
    }
    //endregion -----------------------------------------------------------------------------------------------------
}