package com.shayu.phonelive;

import static com.yunbao.live.socket.SocketClient.mSocketHandler;

import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.net.http.HttpResponseCache;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.adjust.sdk.Adjust;
import com.adjust.sdk.AdjustConfig;
import com.adjust.sdk.AdjustEvent;
import com.adjust.sdk.LogLevel;
import com.alibaba.android.arouter.launcher.ARouter;
import com.blankj.utilcode.util.Utils;
import com.facebook.appevents.AppEventsLogger;
import com.fm.openinstall.OpenInstall;
import com.google.firebase.FirebaseApp;
import com.google.firebase.analytics.FirebaseAnalytics;
import com.google.firebase.crashlytics.FirebaseCrashlytics;
import com.tencent.imsdk.v2.V2TIMGroupMemberInfo;
import com.tencent.imsdk.v2.V2TIMManager;
import com.tencent.imsdk.v2.V2TIMSimpleMsgListener;
import com.tencent.imsdk.v2.V2TIMUserInfo;
import com.yunbao.common.BuildConfig;
import com.yunbao.common.CommonAppConfig;
import com.yunbao.common.CommonAppContext;
import com.yunbao.common.Constants;
import com.yunbao.common.bean.CrashSaveBean;
import com.yunbao.common.http.CommonHttpUtil;
import com.yunbao.common.http.HttpCallback;
import com.yunbao.common.manager.imrongcloud.InstructorSendReward;
import com.yunbao.common.manager.imrongcloud.InstructorSendRewardProvider;
import com.yunbao.common.manager.imrongcloud.MessageIMManager;
import com.yunbao.common.manager.imrongcloud.RecommendLiveRoom;
import com.yunbao.common.manager.imrongcloud.RongcloudIMManager;
import com.yunbao.common.utils.L;
import com.yunbao.common.utils.SpUtil;
import com.yunbao.faceunity.FaceManager;
import com.yunbao.live.socket.SocketRyClient;
import com.yunbao.live.utils.LiveImDeletUtil;
import com.yunbao.live.views.PortraitLiveManager;
import com.yunbao.live.views.RecommendLiveRoomProvider;
import com.yunbao.main.activity.MsgSettActivity;

import org.greenrobot.eventbus.EventBus;

import java.io.File;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import io.rong.imkit.config.RongConfigCenter;
import io.rong.imlib.RongIMClient;
import io.rong.imlib.model.Conversation;
import io.rong.imlib.model.MessageContent;
import io.rong.message.TextMessage;

//import cn.tillusory.sdk.TiSDK;

//import com.squareup.leakcanary.LeakCanary;


/**
 * Created by cxf on 2017/8/3.
 */

public class AppContext extends CommonAppContext {

    public static AppContext sInstance;
    public LiveImDeletUtil liveImDeletUtil;
    private final static List<WeakReference<Activity>> activities = new ArrayList<>();

    private static final class AdjustLifecycleCallbacks implements ActivityLifecycleCallbacks {
        @Override
        public void onActivityResumed(Activity activity) {
            Adjust.onResume();
        }

        @Override
        public void onActivityPaused(Activity activity) {
            Adjust.onPause();
        }

        @Override
        public void onActivityStopped(@NonNull Activity activity) {

        }

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

        }

        @Override
        public void onActivityDestroyed(@NonNull Activity activity) {
            for (WeakReference<Activity> reference : activities) {
                if (reference.get() == activity) {
                    activities.remove(reference);
                    return;
                }
            }
        }

        @Override
        public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
            activities.add(new WeakReference<>(activity));
            CrashSaveBean.getInstance().setActivitySize(activities);
        }

        @Override
        public void onActivityStarted(@NonNull Activity activity) {

        }

    }

    @Override
    public void onCreate() {
        super.onCreate();
        //注册全局异常捕获
        if (!isMainProcess()) {
            return;
        }
        CrashSaveBean.getInstance().setStartTime(System.currentTimeMillis());
        registerError();
        registerFirebaseCrash();
        sInstance = this;
        L.setDeBug(BuildConfig.DEBUG);
        AppEventsLogger.activateApp(this);
        FirebaseAnalytics.getInstance(this);

        File httpCacheDir = new File(getCacheDir(), "https");
        try {
            HttpResponseCache.install(httpCacheDir, 1024 * 1024 * 128);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //初始化 ARouter
        if (BuildConfig.DEBUG) {
            ARouter.openLog();
            ARouter.openDebug();
        }
        ARouter.init(this);


        //初始化 邀请码库
        if (isMainProcess()) {
            OpenInstall.init(this);
        }

        String environment = AdjustConfig.ENVIRONMENT_PRODUCTION;
        AdjustConfig config = new AdjustConfig(this, "3om5fbglyqdc", environment);
        if (CommonAppConfig.IS_GOOGLE_PLAY == false) {
            config.setDefaultTracker("xa7k5ut");
        }
        Adjust.onCreate(config);
        registerActivityLifecycleCallbacks(new AdjustLifecycleCallbacks());
        config.setLogLevel(LogLevel.WARN);
        //激活操作记录
        AdjustEvent adjustEvent = new AdjustEvent("m7wk0c");
        Adjust.trackEvent(adjustEvent);

        //谷歌激活
        mFirebaseAnalytics.logEvent("FS_activation", null);

        //FB激活
        logger.logEvent("FB_activation");

        AdjustEvent adjustEvent2 = new AdjustEvent("p7igfz");
        Adjust.trackEvent(adjustEvent2);
        CommonHttpUtil.setAdvertisingChannels("p7igfz", new HttpCallback() {
            @Override
            public void onSuccess(int code, String msg, String[] info) {
                if (code == 0) {
                    //谷歌激活
                    mFirebaseAnalytics.logEvent("FS_complete_1st_loading", null);
                    //FB激活
                    logger.logEvent("FB_complete_1st_loading");
                }
            }
        });

        //初始化 AndroidUtilCode
        Utils.init(this);
        liveImDeletUtil = new LiveImDeletUtil();

        //初始化融云
        RongcloudIMManager.initRongIM(this);
        ArrayList<Class<? extends MessageContent>> myMessages = new ArrayList<>();
        myMessages.add(RecommendLiveRoom.class);
        myMessages.add(InstructorSendReward.class);

        RongIMClient.registerMessageType(myMessages);
        // 注册自定义消息模板
        RongConfigCenter.conversationConfig().addMessageProvider(new InstructorSendRewardProvider(getApplicationContext()));
        RongConfigCenter.conversationConfig().addMessageProvider(new RecommendLiveRoomProvider(getApplicationContext()));

        RongcloudIMManager.addRongcloudIMOnReceiveMessageListener(new RongIMClient.OnReceiveMessageWrapperListener() {
            @Override
            public boolean onReceived(io.rong.imlib.model.Message message, int i, boolean b, boolean b1) {
                Log.e("wewe", message.getConversationType() + "112121");
                MessageIMManager.get(sInstance).getSystemForRongcloud(message);
                //融云直播间聊天
                Message msg = Message.obtain();
                msg.what = Constants.SOCKET_WHAT_BROADCAST;
                try {
                    if (!"".equals(message.getContent()) && message.getContent() != null) {
                        TextMessage content = (TextMessage) message.getContent();
                        if (content.getContent().contains("_method_")) {
                            msg.obj = content.getContent();
                            //观众页面
                            if (SocketRyClient.mSocketHandler != null
                                    && (TextUtils.equals("__system__", message.getTargetId())
                                    || ("g" + PortraitLiveManager.liveID).contains(message.getTargetId()))) {
                                SocketRyClient.mSocketHandler.sendMessage(msg);
                            }
                            //主播页面
                            if (TextUtils.isEmpty(PortraitLiveManager.liveID) && SocketRyClient.mSocketHandler != null) {
                                SocketRyClient.mSocketHandler.sendMessage(msg);
                            }
                        } else if (message.getConversationType() == Conversation.ConversationType.PRIVATE) {//私聊信息
                            EventBus.getDefault().post(message);
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return false;
            }
        });


        //监听im消息
        V2TIMManager.getInstance().addSimpleMsgListener(new V2TIMSimpleMsgListener() {
            @Override
            public void onRecvGroupTextMessage(String msgID, String groupID, V2TIMGroupMemberInfo sender, String text) {
                super.onRecvGroupTextMessage(msgID, groupID, sender, text);
                Log.e("asasas", text);
                Message msg = Message.obtain();
                msg.what = Constants.SOCKET_WHAT_BROADCAST;
                msg.obj = text;
                if (mSocketHandler != null && Ingroup == 1) {
                    mSocketHandler.sendMessage(msg);
                }
            }

            @Override
            public void onRecvC2CTextMessage(String msgID, V2TIMUserInfo sender, String text) {
                super.onRecvC2CTextMessage(msgID, sender, text);
                Message msg = Message.obtain();
                msg.what = Constants.SOCKET_WHAT_BROADCAST;
                msg.obj = text;
                if (mSocketHandler != null) {
                    CommonAppContext.Ingroup = 1;
                    mSocketHandler.sendMessage(msg);
                }
            }

        });
        configSPApp();
        //初始化美颜SDK
       // FaceManager.initFaceUnity(this);
    }

    /**
     * 配置SharedPreferences默认值
     */
    private void configSPApp() {
        if (!SpUtil.getInstance().isExists(MsgSettActivity.SWITCH_PRIVATE_CHAT_MSG)) {
            SpUtil.getInstance().setBooleanValue(MsgSettActivity.SWITCH_PRIVATE_CHAT_MSG, true);
        }
    }


    public boolean isMainProcess() {
        int pid = android.os.Process.myPid();
        ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        if (activityManager.getRunningAppProcesses() == null) {
            return true;
        }
        for (ActivityManager.RunningAppProcessInfo appProcess : activityManager.getRunningAppProcesses()) {
            if (appProcess.pid == pid) {
                return getApplicationInfo().packageName.equals(appProcess.processName);
            }
        }
        return false;
    }

    @Override
    public void onTerminate() {
        RongcloudIMManager.removeRongcloudIMOnReceiveMessageListener();
        super.onTerminate();
    }

    /**
     * 注册全局异常捕获,有需要时可以在onCreate调用
     */
    private void registerError() {
        NeverCrashUtils.getInstance()
                .setDebugMode(BuildConfig.DEBUG)
                .setMainCrashHandler((t, e) -> {
                    Log.e("ApplicationError", "主线程异常");//此处log只是展示,当debug为true时,主类内部log会打印异常信息
                    e.printStackTrace();
                    //闪退后finish所有Activity并且杀死进程
                    for (WeakReference<Activity> activity : activities) {
                        if (activity != null && activity.get() != null) {
                            activity.get().finish();
                        }
                    }
                   /* Process.killProcess(Process.myPid());
                    System.exit(0);*/
                    setFirebaseCrashData();
                    new Handler(Looper.getMainLooper()).postDelayed(() -> {
                        throw new RuntimeException(e);
                    }, 100);
                })
                .setUncaughtCrashHandler((t, e) -> {
                    Log.e("ApplicationError", "子线程异常");//此处log只是展示,当debug为true时,主类内部log会打印异常信息
                    e.printStackTrace();
                })
                .register(this);
    }

    public void registerFirebaseCrash() {
        if (!CommonAppConfig.IS_UPLOAD_ERROR_LOG) {
            return;
        }
        FirebaseAnalytics.getInstance(this);
        FirebaseApp.initializeApp(this);
    }


    private void setFirebaseCrashData() {
        if (!CommonAppConfig.IS_UPLOAD_ERROR_LOG) {
            return;
        }
        String uid = CommonAppConfig.getInstance().getUid();
        FirebaseCrashlytics.getInstance().setUserId(CommonAppConfig.getInstance().getUid());
        if (uid != null && !uid.isEmpty()) {
            FirebaseCrashlytics.getInstance().setCustomKey("uid", uid);
        } else {
            FirebaseCrashlytics.getInstance().setCustomKey("uid", "uid is null");
        }
        FirebaseCrashlytics.getInstance().setCustomKey("userData", SpUtil.getInstance().getStringValue(SpUtil.USER_INFO));
        FirebaseCrashlytics.getInstance().setCustomKey("isGoogle", CommonAppConfig.IS_GOOGLE_PLAY);
        FirebaseCrashlytics.getInstance().setCustomKey("PhoneName", Build.BRAND);
        FirebaseCrashlytics.getInstance().setCustomKey("Phone", Build.MODEL);
        FirebaseCrashlytics.getInstance().setCustomKey("CPU", Arrays.toString(Build.SUPPORTED_ABIS));
        FirebaseCrashlytics.getInstance().setCustomKey("RunTime", (System.currentTimeMillis() - CrashSaveBean.getInstance().getStartTime()));
        FirebaseCrashlytics.getInstance().setCustomKey("enterRoom", CrashSaveBean.getInstance().getEnterRoom());
        FirebaseCrashlytics.getInstance().setCustomKey("slidingRoom", CrashSaveBean.getInstance().getSlidingRoom());
        FirebaseCrashlytics.getInstance().setCustomKey("playSvga", CrashSaveBean.getInstance().getPlaySvga());
        FirebaseCrashlytics.getInstance().setCustomKey("ActivitySize", CrashSaveBean.getInstance().getActivitySize());
    }
}