package com.edufound.reader.application;

import android.app.Activity;
import android.app.ActivityManager;
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.widget.Toast;

import com.baidu.duer.botsdk.BotSdk;
import com.baidu.duer.botsdk.util.HeartBeatReporter;
import com.edufound.reader.BuildConfig;
import com.edufound.reader.R;
import com.edufound.reader.activity.CrashDialogActivity;
import com.edufound.reader.bean.ChannelCodeEnum;
import com.edufound.reader.botsdk.BotConstants;
import com.edufound.reader.botsdk.BotMessageListener;
import com.edufound.reader.botsdk.BotSDKUtils;
import com.edufound.reader.cusview.CusToast;
import com.edufound.reader.support.CrashLog;
import com.edufound.reader.support.DebugSafeModeTipActivity;
import com.edufound.reader.support.DebugSafeModeUI;
import com.edufound.reader.util.Cockroach;
import com.edufound.reader.util.Consts;
import com.edufound.reader.util.DeviceUuidFactory;
import com.edufound.reader.util.ExceptionHandler;
import com.edufound.reader.util.OkHttpClient;
import com.orhanobut.logger.AndroidLogAdapter;
import com.orhanobut.logger.FormatStrategy;
import com.orhanobut.logger.Logger;
import com.orhanobut.logger.PrettyFormatStrategy;
import com.tencent.mmkv.MMKV;
import com.umeng.analytics.MobclickAgent;
import com.umeng.commonsdk.UMConfigure;
import com.umeng.commonsdk.listener.OnGetOaidListener;

import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

import java.util.ArrayList;
import java.util.List;

import androidx.annotation.RequiresApi;

public class EApplication extends Application {

    private int activityAount = 0;
    public boolean isForeground = false;
    public static long APP_START_TIME = 0;
    public static List<Activity> mActivityList = new ArrayList<>();

    @Override
    public void onCreate() {
        super.onCreate();
        try {
            Consts.setIsDebug(false);
            Consts.setmApplicAtion(this);

            //初始化异常监听
//            CrashHandler.getInstance().init(this);
//            initException();

            XmlPullParserFactory.newInstance().setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);

            //初始化OKhttp3
            OkHttpClient.initOkHttpUtil(getApplicationContext());

            //初始化logger
            FormatStrategy formatStrategy = PrettyFormatStrategy.newBuilder()
                    .showThreadInfo(false)  // 是否显示线程信息,默认为ture
                    .methodCount(3)         // 显示的方法行数,默认为2
//                    .methodOffset(1)        // 隐藏内部方法调用到偏移量,默认为5
//                    .logStrategy() // 更改要打印的日志策略。
                    .tag(getPackageName())   // 每个日志的全局标记。默认PRETTY_LOGGER
                    .build();
            Logger.addLogAdapter(new AndroidLogAdapter(formatStrategy));
            //初始化友盟
            UMConfigure.setLogEnabled(true);
            UMConfigure.preInit(this, getUmengAppKey(), getUmengChannel());
            UMConfigure.init(this, getUmengAppKey(), getUmengChannel(), UMConfigure.DEVICE_TYPE_PHONE, "");
            UMConfigure.getOaid(this, new OnGetOaidListener() {
                @Override
                public void onGetOaid(String s) {
                    Logger.e("umeng_oaid:" + s);
                }
            });
            MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.AUTO);

//            UMConfigure.preInit(this,"");
            //初始化MMKV
            MMKV.initialize(this);
            //初始化DeviceUuidFactory
            if (DeviceUuidFactory.getUuid() == null) {
                new DeviceUuidFactory(getApplicationContext());
            }
            Consts.setUID("test");
            Logger.e("Consts.uid:" + Consts.getUID());
            //初始化activity监听
            registerActivityLifecycleCallbacks(activityLifecycleCallbacks);
            if (Consts.getUmengChannel().equals(ChannelCodeEnum.BAIDU.getChannelCode())) {
                /** 接入益智乐园的App,需要删掉下面这一行。保证益智乐园的付费等逻辑正常执行,不知道益智乐园是啥的,不要删掉这一行 */
                HeartBeatReporter.getInstance().setShouldUploadHeartBeatByApp(false);
                // 初始化BotSDK
                BotSdk.getInstance().init(this);
                // 打开BotSDK的Log开关,开发阶段建议打开Log开关,便于排查问题
//                BotSdk.enableLog(BuildConfig.DEBUG);
                String random1 = BotConstants.RANDOM1_PREFIX + Math.random();
                String random2 = BotConstants.RANDOM2_PREFIX + Math.random();
                // 在线校验示例3
                BotSdk.getInstance().register(BotMessageListener.getInstance(), BotConstants.BOTID,
                        random1, BotSDKUtils.sign(random1), random2, BotSDKUtils.sign(random2));

            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }


    }


    public static void killAppProcess(Context context) {
        //注意:不能先杀掉主进程,否则逻辑代码无法继续执行,需先杀掉相关进程最后杀掉主进程
        MobclickAgent.onKillProcess(context.getApplicationContext());
        ActivityManager mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> mList = mActivityManager.getRunningAppProcesses();
        for (ActivityManager.RunningAppProcessInfo runningAppProcessInfo : mList) {
            if (runningAppProcessInfo.pid != android.os.Process.myPid()) {
                android.os.Process.killProcess(runningAppProcessInfo.pid);
            }
        }
        android.os.Process.killProcess(android.os.Process.myPid());
//        System.exit(0);
    }

    ActivityLifecycleCallbacks activityLifecycleCallbacks = new ActivityLifecycleCallbacks() {
        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
        }

        @Override
        public void onActivityStarted(Activity activity) {
            if (activityAount == 0) {
                //app回到前台
                isForeground = true;
//                ToastUtil.showToast("app回到前台了");

                APP_START_TIME = System.currentTimeMillis();
            }
            activityAount++;
        }

        @Override
        public void onActivityResumed(Activity activity) {
        }

        @Override
        public void onActivityPaused(Activity activity) {
        }

        @Override
        public void onActivityStopped(Activity activity) {
            activityAount--;
            if (activityAount == 0) {
                isForeground = false;
//                ToastUtil.showToast("app后台了");
                if (Consts.getUmengChannel().equals(ChannelCodeEnum.YIFANG.getChannelCode())) {
                    killAppProcess(Consts.getmApplicAtion());
                }
            }
        }

        @Override
        public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
        }

        @Override
        public void onActivityDestroyed(Activity activity) {
        }
    };

    private void initException() {
        final Thread.UncaughtExceptionHandler sysExcepHandler = Thread.getDefaultUncaughtExceptionHandler();
        final Toast toast = Toast.makeText(this, "", Toast.LENGTH_SHORT);
        DebugSafeModeUI.init(this);
        Cockroach.install(this, new ExceptionHandler() {
            @Override
            protected void onUncaughtExceptionHappened(Thread thread, Throwable throwable) {
                CrashLog.saveCrashLog(getApplicationContext(), throwable);
                new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
//                        toast.setText(R.string.safe_mode_excep_tips);
//                        toast.show();
                    }
                });
            }

            @Override
            protected void onBandageExceptionHappened(Throwable throwable) {
                throwable.printStackTrace();//打印警告级别log,该throwable可能是最开始的bug导致的,无需关心
//                toast.setText("Cockroach Worked");
//                toast.show();
            }

            @Override
            protected void onEnterSafeMode() {
//                int tips = R.string.safe_mode_tips;
//                Toast.makeText(Consts.getmApplicAtion(), getResources().getString(tips), Toast.LENGTH_LONG).show();
//                DebugSafeModeUI.showSafeModeUI();

                if (Consts.isIsDebug()) {
                    Intent intent = new Intent(Consts.getmApplicAtion(), DebugSafeModeTipActivity.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
                } else {
                    Intent intent = new Intent(Consts.getmApplicAtion(), CrashDialogActivity.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
                }
            }

            @RequiresApi(api = Build.VERSION_CODES.N)
            @Override
            protected void onMayBeBlackScreen(Throwable e) {
                Thread thread = Looper.getMainLooper().getThread();
                e.printStackTrace();
                //黑屏时建议直接杀死app
                sysExcepHandler.uncaughtException(thread, new RuntimeException("black screen"));
                for (int i = 0; i < mActivityList.size(); i++) {
                    mActivityList.get(i).finish();
                }
                killAppProcess(Consts.getmApplicAtion());
            }

        });

    }

    public String getUmengChannel() {
        String channelName = null;
        try {
            PackageManager packageManager = getPackageManager();
            if (packageManager != null) {
                //注意此处为ApplicationInfo 而不是 ActivityInfo,因为友盟设置的meta-data是在application标签中,而不是某activity标签中,所以用ApplicationInfo
                ApplicationInfo applicationInfo = packageManager.
                        getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
                if (applicationInfo != null) {
                    if (applicationInfo.metaData != null) {
                        channelName = String.valueOf(applicationInfo.metaData.get("UMENG_CHANNEL"));
                        Consts.setUmengChannel(channelName);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return channelName;
    }


    public String getUmengAppKey() {
        String appkey = null;
        try {
            PackageManager packageManager = getPackageManager();
            if (packageManager != null) {
                //注意此处为ApplicationInfo 而不是 ActivityInfo,因为友盟设置的meta-data是在application标签中,而不是某activity标签中,所以用ApplicationInfo
                ApplicationInfo applicationInfo = packageManager.
                        getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
                if (applicationInfo != null) {
                    if (applicationInfo.metaData != null) {
                        appkey = String.valueOf(applicationInfo.metaData.get("UMENG_APPKEY"));
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return appkey;
    }
}