package com.bjysdk;

import android.app.Activity;
import android.app.Application;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.baijiahulian.common.utils.StringUtils;
import com.baijiayun.BJYPlayerSDK;
import com.baijiayun.groupclassui.InteractiveClassUI;
import com.baijiayun.live.ui.LiveSDKWithUI;
import com.baijiayun.livecore.LiveSDK;
import com.baijiayun.livecore.context.LPConstants;
import com.baijiayun.livecore.models.LPSignEnterRoomModel;
import com.baijiayun.videoplayer.ui.bean.VideoPlayerConfig;
import com.baijiayun.videoplayer.ui.playback.PBRoomUI;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableMap;

import java.util.HashMap;
import java.util.Map;

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

/**
 * Created by tdzl2003 on 3/31/16.
 */
public class BjyModule extends ReactContextBaseJavaModule {
    private static final String TAG = "BjyModule";

    private ReactApplicationContext reactContext;
    private Callback callback;
    public static final String EXIT = "exit";
    public static final String SMALL_GROUP_CLASS_ACTIVITY = "com.baijiayun.groupclassui.global.GroupClassActivity";
    public static final String LIVE_SINGLE_ACTIVITY = "com.baijiayun.live.ui.LiveRoomSingleActivity";
    public static final String LIVE_TRIPLE_ACTIVITY = "com.baijiayun.live.ui.LiveRoomTripleActivity";
    public static final String PB_ROOM_ACTIVITY = "com.baijiayun.videoplayer.ui.activity.PBRoomActivity";
    public static final String TEST = "com.bjysdk.TestActivity";

    public BjyModule(ReactApplicationContext reactContext) {
        super(reactContext);
        this.reactContext = reactContext;
    }

    @Override
    public String getName() {
        return "BjyModule";
    }


    @ReactMethod
    public void initSdkDomain(String domain) {
        new BJYPlayerSDK.Builder((Application) this.reactContext.getApplicationContext())
                .setDevelopMode(false)
                .setEncrypt(true)
                .build();


        Log.d(TAG, "initSdkDomain====");
        LiveSDK.customEnvironmentPrefix = domain;
        Application applicationContext = (Application) this.reactContext.getApplicationContext();
        applicationContext.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
                Log.d(TAG, "onActivityCreated" + activity.getClass().getName());
            }

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

            }

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

            }

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

            }

            @Override
            public void onActivityStopped(@NonNull Activity activity) {
                Log.d(TAG, "onActivityStopped" + activity.getClass().getName());
                if (SMALL_GROUP_CLASS_ACTIVITY.equals(activity.getClass().getName()) ||
                        LIVE_SINGLE_ACTIVITY.equals(activity.getClass().getName()) ||
                        LIVE_TRIPLE_ACTIVITY.equals(activity.getClass().getName()) ||
                        PB_ROOM_ACTIVITY.equals(activity.getClass().getName()) ||
                        TEST.equals(activity.getClass().getName())
                ) {
                    if (activity.isFinishing() && callback != null) {
                        Log.d("onActivityDestroyed", "callEXIT");
                        try {
                            if(callback!=null) {
                                callback.invoke(EXIT);
                                callback=null;
                            }
                        } catch (Exception ee) {

                        }
                    }
                }
            }

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

            }

            @Override
            public void onActivityDestroyed(@NonNull Activity activity) {
                Log.d(TAG, "onActivityDestroyed" + activity.getClass().getName());

            }
        });


    }

    @ReactMethod
    public void playOTOLive(ReadableMap readableMap, Callback callback) {
        if (isFastDoubleClick()) {
            return;
        }
        this.callback = callback;
        startSmallGroupActivity(getCurrentActivity(), readableMap);

    }

    @ReactMethod
    public void playScRoomLive(ReadableMap readableMap, Callback callback) {
        if (isFastDoubleClick()) {
            return;
        }
        this.callback = callback;
        startLiveRoomActivity(getCurrentActivity(), readableMap, callback);

    }

    @ReactMethod
    public void playBackRoom(ReadableMap readableMap, Callback callback) {
        if (isFastDoubleClick()) {
            return;
        }
        this.callback = callback;
        startBackPlayActivity(getCurrentActivity(), readableMap);
    }

    @ReactMethod
    public void playNormalLive(ReadableMap readableMap, Callback callback) {
        if (isFastDoubleClick()) {
            return;
        }
        this.callback = callback;
        startLiveRoomActivity(getCurrentActivity(), readableMap, callback);

    }

    public static String getStringVal(ReadableMap map, String key) {
        if (map.hasKey(key)) {
            return map.getString(key);
        }
        return "";
    }

    public static int getIntVal(ReadableMap map, String key, int defaultVal) {
        if (map.hasKey(key)) {
            return map.getInt(key);
        }
        return defaultVal;
    }

    private void startLiveRoomActivity(final Activity activity, ReadableMap map, Callback callback) {
        String roomId = getStringVal(map, "roomId");
        String name = getStringVal(map, "user_name");
        String avatar = getStringVal(map, "user_avatar");
        int userType = getIntVal(map, "user_role", 0);
        String sing = getStringVal(map, "sign");
        String userNum = getStringVal(map, "user_number");
        int groupId = getIntVal(map, "group_id", -1);

        LPSignEnterRoomModel model = new LPSignEnterRoomModel(Long.parseLong(roomId),name,userNum,avatar,groupId,LPConstants.LPUserType.from(userType),sing);
        LiveSDKWithUI.enterRoom(activity,model);
    }

    public static void showToast(Activity activity, String msg) {
        Toast.makeText(activity, msg, Toast.LENGTH_SHORT).show();
    }

    private void startSmallGroupActivity(Activity activity, ReadableMap map) {
        String roomId = getStringVal(map, "roomId");
        String name = getStringVal(map, "user_name");
        String avatar = getStringVal(map, "user_avatar");
        int userType = getIntVal(map, "user_role", 0);
        String sing = getStringVal(map, "sign");
        String userNum = getStringVal(map, "user_number");
        int groupId = getIntVal(map, "group_id", -1);

        if (StringUtils.isEmpty(roomId)) {
            showToast(activity, "'没有房间号'");
            return;
        }

        LPSignEnterRoomModel model = new LPSignEnterRoomModel(Long.parseLong(roomId),name,userNum,avatar, groupId,LPConstants.LPUserType.from(userType), sing);
        InteractiveClassUI.enterRoom(activity, model);
    }

    private void startBackPlayActivity(Activity activity, ReadableMap map) {
//        Bundle bundle = new Bundle();
//        bundle.putString("pb_room_id", getStringVal(map, "roomId"));
//        bundle.putString("pb_room_token", getStringVal(map, "token"));
//        bundle.putString("pb_room_session_id", "-1");
//        bundle.putString("type", "backplay");
//        Intent intent = new Intent(activity, PBRoomActivity.class);
//        intent.putExtras(bundle);
//        activity.startActivity(intent);
        VideoPlayerConfig playerConfig = new VideoPlayerConfig();
        playerConfig.supportBreakPointPlay = true;
        playerConfig.supportBackgroundAudio = true;
        PBRoomUI.enterPBRoom(activity, getStringVal(map, "roomId"), getStringVal(map, "token"), "-1", playerConfig, new PBRoomUI.OnEnterPBRoomFailedListener() {
            @Override
            public void onEnterPBRoomFailed(String s) {
                showToast(activity, s);
            }
        });
    }

    public static boolean isFastDoubleClick() {
        return isFastDoubleClick("click", 500);
    }

    public static boolean isFastDoubleClick(String tag) {
        return isFastDoubleClick(tag, 1000);
    }

    private static long lastClickTime = 0;

    public static boolean isFastDoubleClick(String tag, long duration) {
        long time = System.currentTimeMillis();
        long timeD = time - lastClickTime;
        if (0 < timeD && timeD < duration) {
            return true;
        }
        lastClickTime = System.currentTimeMillis();
        return false;
    }

}
