package cn.tee3.demo.activity;

import android.Manifest;
import android.app.Application;
import android.content.Context;
import android.media.AudioManager;
import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;

import com.tencent.bugly.crashreport.CrashReport;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;

import cn.tee3.avd.AVDEngine;
import cn.tee3.avd.Tlog;
import cn.tee3.manager.bean.CommonBean;
import cn.tee3.manager.service.AVDManager;
import cn.tee3.manager.service.RequestPermissions;
import cn.tee3.manager.service.Setting;
import cn.tee3.manager.util.MyToast;
import xcrash.ICrashCallback;
import xcrash.XCrash;

public class MyApplication extends Application {

    public static SetupType SETUP_TYPE = SetupType.RESETUP_ENGINE_MODE;

    public enum SetupType {
        REJOIN_ROOM_MODE,       /** 加入房间前先初始化好SDK引擎，跳转到房间界面时 “加入房间”，离开房间界面时 “离开房间”，退出APP时 “SDK释放”*/
        RESETUP_ENGINE_MODE     /** 每次加会和离会都把流程走一遍：加入房间界面 -> 初始化SDK引擎，获取并“加入房间”（房间不存在则创建新房间）; 离开房间界面 -> “离开房间” 并释放SDK*/
    }

    /* 服务器配置 */
    public static Setting.AVDAuthentication avdAuthentication = new Setting.AVDAuthentication(
            CommonBean.serverURI,
            CommonBean.accessKey,
            CommonBean.secretKey);

    /* 配置入会选项 */
    public static Setting.AVDOption avdOption = new Setting.AVDOption(
            false,       // 开启摄像头
            false,         // 开启麦克风
            false,       // 开启外放（听筒和外放设置）
            true,     // 使用硬件编码器
            true,     // 使用硬件解码器
            CommonBean.LogParams.verbose,   // 日志等级配置为最低方便调试，上线版本可配置为 Warning
            CommonBean.Resolution.MIDDLE,   // 视频分辨率设置
            CommonBean.VideoCodec.H264);    // 编码格式优先使用H264编码，如不支持则使用软编码

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);

//        XCrash.InitParameters parameters = new XCrash.InitParameters();
//        parameters.setLogDir(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "doubleRecord" + File.separator + new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()) + "_dump");
////        xcrash.XCrash.init(this, parameters);
//        xcrash.XCrash.init(this);
    }

    @Override
    public void onCreate() {
        super.onCreate();
//        CrashReport.initCrashReport(getApplicationContext());
//        CrashReport.UserStrategy strategy = new CrashReport.UserStrategy(getApplicationContext());
//        strategy.setCrashHandleCallback(new CrashReport.CrashHandleCallback() {
//            public Map<String, String> onCrashHandleStart(int crashType, String errorType,
//                                                          String errorMessage, String errorStack) {
//
//                Log.e("qqq", "CrashReport: \n[crashType] : " + crashType + ", [errorType] : " + errorType + "\n[errorMessage] : " + errorMessage + "\n[errorStack] : \n" + errorStack);
//                return null;
//            }
//
//            @Override
//            public byte[] onCrashHandleStart2GetExtraDatas(int crashType, String errorType,
//                                                           String errorMessage, String errorStack) {
//                return null;
//            }
//
//        });
//        CrashReport.initCrashReport(getApplicationContext(), strategy);

//        AVDEngine.instance().setOption(AVDEngine.Option.eo_auto_drop_frame, "true");
//        AVDEngine.instance().setOption(AVDEngine.Option.eo_auto_drop_frame_limit_bitrate_times, "1");
//        AVDEngine.instance().setOption(AVDEngine.Option.eo_auto_drop_frame_min_framerate, "10");

        AVDManager.getInstance()
                // 设置服务器地址和鉴权信息，不调用则使用默认的测试服务器
                .AVDAuthentication(avdAuthentication)
                // 设置AVDSDK选项，不调用则使用默认参数
                .setOption(avdOption);

        if (!RequestPermissions.getInstance().isGranted(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            return;
        }

        if (MyApplication.SETUP_TYPE == SetupType.REJOIN_ROOM_MODE) {
            initAVDEngine(this, new AVDManager.InitAVDEngineListener() {
                @Override
                public void success() {
                    MyToast.showToast(MyApplication.this, "初始化引擎成功", true, true);
                }

                @Override
                public void error(String errorCode) {
                    MyToast.showToast(MyApplication.this, errorCode, true, true);
                }
            });
        }
    }

    /**
     *  初始化 SDK 引擎
     */
    public static void initAVDEngine(Context context, final AVDManager.InitAVDEngineListener listener) {
        AVDManager.getInstance()
                .initAVDEngine(context, new AVDManager.InitAVDEngineListener() {
                    @Override
                    public void success() {
                        if (listener != null) {
                            listener.success();
                        }
                    }

                    @Override
                    public void error(String errorCode) {
                        if (listener != null) {
                            listener.error(errorCode);
                        }
                    }
                });
    }
}
