package com.edufound.android.xyyf.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.Bundle;
import android.support.annotation.Nullable;

import com.edufound.android.xyyf.R;
import com.edufound.android.xyyf.pay.PayInit;
import com.edufound.android.xyyf.util.ContextUtil;
import com.edufound.android.xyyf.util.Logger;
import com.edufound.android.xyyf.util.OKHttpUtil;
import com.edufound.android.xyyf.util.SPutil;

import org.android.agoo.vivo.VivoRegister;
import org.android.agoo.xiaomi.MiPushRegistar;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import okhttp3.Request;

public class EApplication extends Application {


    final String XIAOMI_ID = "";
    final String XIAOMI_KEY = "";
    static String mUMengAppID;
    private int activityAount = 0;
    public boolean isForeground = false;
    public static long APP_START_TIME = 0;

    @Override
    public void onCreate() {
        super.onCreate();
        ContextUtil.setContext(this);
        ContextUtil.setApplication(this);
        //上线关掉debug模式
        ContextUtil.setIsDebug(true);
        mUMengAppID = getChannelName();
        APP_START_TIME = System.currentTimeMillis();
        //根据appcode初始化支付sdk
//        UMConfigure.setLogEnabled(true);
//        UMConfigure.init(this, "5ffbb9e0f1eb4f3f9b58b05e", getAppCode() + "", UMConfigure.DEVICE_TYPE_PHONE, "dfc59afd6dc6b1550ff1c2e0c7eb10fd");
//        PushAgent mPushAgent = PushAgent.getInstance(this);
//        mPushAgent.register(new IUmengRegisterCallback() {
//            @Override
//            public void onSuccess(String deviceToken) {
//                Logger.e("DeviceToken:" + deviceToken);
//            }
//
//            @Override
//            public void onFailure(String s, String s1) {
//                Logger.e("注册失败:-------->  " + "s:" + s + ",s1:" + s1);
//            }
//        });

        registerActivityLifecycleCallbacks(activityLifecycleCallbacks);


        PayInit.getInstance().initPaySDK(Integer.valueOf(getAppCode()), EApplication.this);
        if (!getPackageName().equals(
                getProcessName(getApplicationContext(), android.os.Process.myPid()))) {
            return;
        }

        //如果是新应用,默认设置播放器为ijkplayer
        if (SPutil.getPrefInt(this, SPutil.videoType, 0) == 0) {
            SPutil.setPrefInt(this, SPutil.videoType, SPutil.VIDEO_IJKPLAYER);
        }
    }

    public static void exitApp() {
        Intent intent_close = new Intent(ContextUtil.CLOSE_ACTIVITY_SPLASH);
        ContextUtil.getContext().sendBroadcast(intent_close);
    }

    private static List<Activity> getAllActivitys() {
        List<Activity> list = new ArrayList<>();
        try {
            Class<?> activityThread = Class.forName("android.app.ActivityThread");
            Method currentActivityThread = activityThread.getDeclaredMethod("currentActivityThread");
            currentActivityThread.setAccessible(true);
            //获取主线程对象
            Object activityThreadObject = currentActivityThread.invoke(null);
            Field mActivitiesField = activityThread.getDeclaredField("mActivities");
            mActivitiesField.setAccessible(true);
            Map<Object, Object> mActivities = (Map<Object, Object>) mActivitiesField.get(activityThreadObject);
            for (Map.Entry<Object, Object> entry : mActivities.entrySet()) {
                Object value = entry.getValue();
                Class<?> activityClientRecordClass = value.getClass();
                Field activityField = activityClientRecordClass.getDeclaredField("activity");
                activityField.setAccessible(true);
                Object o = activityField.get(value);
                list.add((Activity) o);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }

    public static void clearActivity() {
        List<Activity> myAclist = getAllActivitys();
        for (int i = 0; i < myAclist.size(); i++) {
            myAclist.get(i).finish();
        }
    }

    @Nullable
    public String getProcessName(Context cxt, int pid) {
        ActivityManager am = (ActivityManager) cxt.getSystemService(Context.ACTIVITY_SERVICE);
        if (am == null) {
            return null;
        }

        List<ActivityManager.RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();
        if (runningApps != null && !runningApps.isEmpty()) {
            for (ActivityManager.RunningAppProcessInfo procInfo : runningApps) {
                if (procInfo.pid == pid) {
                    return procInfo.processName;
                }
            }
        }

        return null;
    }


    public static String getAppCode() {
        //记得改友盟code
        return mUMengAppID;
    }

    public String getChannelName() {
        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"));
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return channelName;
    }

    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回到前台了");
                Logger.e("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后台了");
                Logger.e("app后台了");
                OKHttpUtil.getInstance().postUserTime(new OKHttpUtil.ResultCallback() {
                    @Override
                    public void onError(Request request, Exception e) {
//                        exitApp();
//                        android.os.Process.killProcess(android.os.Process.myPid());
                        APP_START_TIME = 0;
                    }

                    @Override
                    public void onResponse(Object response) {
                        Logger.e("response:" + response);
//                        exitApp();
//                        android.os.Process.killProcess(android.os.Process.myPid());
                        APP_START_TIME = 0;
                    }
                });

            }
        }

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

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