package com.xyoye.dandanplay.app;

import android.annotation.TargetApi;
import android.app.Application;
import android.content.Context;
import android.content.res.AssetManager;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.os.StrictMode;

import com.blankj.utilcode.util.Utils;
import com.xyoye.dandanplay.ui.activities.SplashActivity;
import com.xyoye.dandanplay.ui.activities.personal.CrashActivity;
import com.xyoye.player.commom.utils.PlayerConfigShare;
import com.taobao.sophix.SophixManager;
import com.tencent.bugly.Bugly;
import com.xunlei.downloadlib.XLTaskHelper;
import com.xyoye.dandanplay.utils.database.DataBaseManager;
import com.xyoye.dandanplay.utils.AppConfig;
import com.xyoye.dandanplay.utils.CommonUtils;
import com.xyoye.dandanplay.utils.SoUtils;
import com.xyoye.dandanplay.utils.net.okhttp.CookiesManager;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import cat.ereza.customactivityoncrash.config.CaocConfig;
import skin.support.SkinCompatManager;
import skin.support.app.SkinCardViewInflater;
import skin.support.constraint.app.SkinConstraintViewInflater;
import skin.support.design.app.SkinMaterialViewInflater;
import skin.support.flycotablayout.app.SkinFlycoTabLayoutInflater;

/**
 * Created by xyoye on 2019/5/27.
 */

public class IApplication extends Application {
    //tracker列表
    public static List<String> trackers = new ArrayList<>();
    //应用是否正常的启动
    public static boolean startCorrectlyFlag = false;

    private static Handler mainHandler;
    private static ThreadPoolExecutor executor;
    private static ExecutorService sqlExecutor;
    private static Context _context;
    private static AssetManager _asset;
    private static CookiesManager cookiesManager;

    @TargetApi(Build.VERSION_CODES.GINGERBREAD)
    @Override
    public void onCreate() {
        super.onCreate();
        _context = this.getApplicationContext();
        _asset = _context.getAssets();

        //AndroidUtilsCode
        Utils.init(this);

        //skins
        SkinCompatManager.withoutActivity(this)                         // 基础控件换肤初始化
                .addInflater(new SkinMaterialViewInflater())            // material design 控件换肤初始化[可选]
                .addInflater(new SkinConstraintViewInflater())          // ConstraintLayout 控件换肤初始化[可选]
                .addInflater(new SkinCardViewInflater())                // CardView v7 控件换肤初始化[可选]
                .addInflater(new SkinFlycoTabLayoutInflater())
                .setSkinStatusBarColorEnable(true)                      // 关闭状态栏换肤,默认打开[可选]
                .setSkinWindowBackgroundEnable(true)                    // 关闭windowBackground换肤,默认打开[可选]
                .setSkinAllActivityEnable(true)
                .loadSkin();

        //Crash
        CaocConfig.Builder.create()
                .backgroundMode(CaocConfig.BACKGROUND_MODE_SHOW_CUSTOM)
                .enabled(true)
                .trackActivities(true)
                .minTimeBetweenCrashesMs(2000)
                .restartActivity(SplashActivity.class)
                .errorActivity(CrashActivity.class)
                .apply();

        //Bugly
        Bugly.init(getApplicationContext(), SoUtils.getInstance().getBuglyAppId(), false);

        //Sophix
        SophixManager.getInstance().setPatchLoadStatusStub(CommonUtils.getPatchLoadListener());

        //thunder
        XLTaskHelper.init(this);

        //数据库
        DataBaseManager.init(this);

        //播放器配置
        PlayerConfigShare.initPlayerConfigShare(this);

        //检查补丁
        if (AppConfig.getInstance().isAutoQueryPatch()){
            SophixManager.getInstance().queryAndLoadNewPatch();
        }

        startCorrectlyFlag = true;

        //严格模式
        //strictMode();
    }

    /**
     * 获取主线程的handler
     */
    public static Handler getMainHandler(){
        if (mainHandler == null){
            mainHandler = new Handler(Looper.getMainLooper());
        }
        return mainHandler;
    }

    /**
     * 应用内通用一个线程池
     */
    public static ThreadPoolExecutor getExecutor() {
        if (executor == null) {
            executor = new ThreadPoolExecutor(3, 10, 200, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(20));
        }
        return executor;
    }

    /**
     * 数据库读写线程池
     */
    public static ExecutorService getSqlThreadPool(){
        if (sqlExecutor == null) {
            sqlExecutor = Executors.newSingleThreadExecutor();
        }
        return sqlExecutor;
    }

    /**
     * cookie管理器
     */
    public static CookiesManager getCookiesManager() {
        if (cookiesManager == null) {
            cookiesManager = new CookiesManager(get_context());
        }
        return cookiesManager;
    }

    /**
     * 严格模式启动
     */
    private void strictMode(){
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                .detectDiskReads()
                .detectDiskWrites()
                .detectNetwork()
                .penaltyLog()
                .build());
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                .detectLeakedSqlLiteObjects()
                .detectLeakedClosableObjects()
                .penaltyLog()
                .penaltyDeath()
                .build());
    }

    public static Context get_context() {
        return _context;
    }

    public static AssetManager get_asset() {
        return _asset;
    }

    public static boolean isDebug() {
        return false;
    }

}