package com.domain.zlink.myhrtemplate.view;

import android.content.Context;
import android.support.multidex.MultiDex;
import android.support.multidex.MultiDexApplication;

import com.crashlytics.android.Crashlytics;
import com.crashlytics.android.answers.Answers;
import com.domain.data.db.until.MyAppDataManager;
import com.domain.data.utils.Contextor;
import com.domain.zlink.myhrtemplate.di.components.ApplicationComponent;
import com.domain.zlink.myhrtemplate.di.components.DaggerApplicationComponent;
import com.domain.zlink.myhrtemplate.di.modules.ApplicationModule;
import com.facebook.stetho.Stetho;
import com.google.firebase.iid.FirebaseInstanceId;
import com.uphyca.stetho_realm.RealmInspectorModulesProvider;

import org.greenrobot.eventbus.EventBus;

import io.fabric.sdk.android.Fabric;
import io.reactivex.schedulers.Schedulers;
import io.realm.Realm;
import io.realm.RealmConfiguration;
import th.co.csc.android.cscapi.BuildConfig;
import th.co.csc.android.cscapi.CscApi;
import timber.log.Timber;

/**
 * Created by niceinkeaw on 21/2/2559.
 */
public class AndroidApplication extends MultiDexApplication {
    private ApplicationComponent applicationComponent;
    private MyAppDataManager myAppDataManager;
    private static AndroidApplication INSTANCE;

    public AndroidApplication() {
        INSTANCE = this;
    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

    @Override
    public void onCreate() {
        super.onCreate();
        initializeInjector();
        Contextor.getInstance().init(getApplicationContext());
        CscApi.getInstance().init(getApplicationContext());
        CscApi.getInstance().setServerCommandSubscribeOn(Schedulers.from(applicationComponent.threadExecutor()));

        //EventBus.getDefault().register(this);

        //scheduleUploadTimeStampAlarm();

        if (BuildConfig.DEBUG) {
            Timber.plant(new Timber.DebugTree());
        }

        Fabric.with(this, new Answers(),new Crashlytics());

        Realm.init(this);
        RealmConfiguration realmConfiguration = new RealmConfiguration.Builder().build();
        Realm.setDefaultConfiguration(realmConfiguration);

        Stetho.initialize(
                Stetho.newInitializerBuilder(this)
                        .enableDumpapp(Stetho.defaultDumperPluginsProvider(this))
                        .enableWebKitInspector(RealmInspectorModulesProvider.builder(this).build())
                        .build());


    }


    public static AndroidApplication getInstance() {
        return INSTANCE;
    }

    public MyAppDataManager getMyAppDataManager() {
        return myAppDataManager;
    }

    // Setup a recurring alarm every half hour
    /*public void scheduleUploadTimeStampAlarm() {
        // Construct an intent that will execute the AlarmReceiver
        Intent intent = new Intent(getApplicationContext(), UploadTimeStampAlarmReceiver.class);
        // Create a PendingIntent to be triggered when the alarm goes off
        final PendingIntent pIntent = PendingIntent.getBroadcast(this, UploadTimeStampAlarmReceiver.REQUEST_CODE,
                intent, PendingIntent.FLAG_UPDATE_CURRENT);
        // Setup periodic alarm every 5 seconds
        long firstMillis = System.currentTimeMillis(); // alarm is set right away
        AlarmManager alarm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
        //alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP,firstMillis,30*1000,pIntent);
        alarm.setRepeating(AlarmManager.RTC_WAKEUP, firstMillis, 60 * 1000, pIntent);
    }*/


    private void initializeInjector() {
        this.applicationComponent = DaggerApplicationComponent.builder()
                .applicationModule(new ApplicationModule(this))
                .build();
    }

    public ApplicationComponent getApplicationComponent() {
        return this.applicationComponent;
    }

    @Override
    public void onTerminate() {
        EventBus.getDefault().unregister(this);
        super.onTerminate();
    }

    /*@Subscribe(threadMode = ThreadMode.MAIN)
    public void onReloadFaceTemplate(ReloadFaceTemplateEvent event){
        if(myAppDataManager!=null){
            myAppDataManager.reloadTemplate();
            Timber.d("Reload All Template");
            EventBus.getDefault().post(new FetchTimeStampEvent());
        }
    }*/

    public void clearAppData(){
        Realm realm = Realm.getDefaultInstance();
        try{
            realm.beginTransaction();
            realm.deleteAll();
            myAppDataManager.clear();
            realm.commitTransaction();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            realm.close();
        }
    }

    public void initialize() {
        myAppDataManager = new MyAppDataManager(this);
        //CSCFaceRecognition.getInstance().init(getApplicationContext());
    }

    public String getFirebaseInstanceToken(){
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        return refreshedToken;
    }
}