package com.rnoneclick;

import static com.rnoneclick.AppUtils.dp2px;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.graphics.Color;
import android.os.Build;
import android.text.TextUtils;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.alibaba.fastjson.JSON;
import com.facebook.react.bridge.ActivityEventListener;
import com.facebook.react.bridge.Arguments;
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 com.facebook.react.bridge.WritableMap;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.mobile.auth.gatewayauth.AuthRegisterViewConfig;
import com.mobile.auth.gatewayauth.AuthUIConfig;
import com.mobile.auth.gatewayauth.CustomInterface;
import com.mobile.auth.gatewayauth.PhoneNumberAuthHelper;
import com.mobile.auth.gatewayauth.PreLoginResultListener;
import com.mobile.auth.gatewayauth.ResultCode;
import com.mobile.auth.gatewayauth.TokenResultListener;
import com.mobile.auth.gatewayauth.model.TokenRet;
import com.rnoneclick.config.AuthPageConfig;
import com.rnoneclick.config.BaseUIConfig;
import com.rnoneclick.config.OneKeyConfig;

public class RNOneClickModule extends ReactContextBaseJavaModule implements ActivityEventListener {
    private static final String TAG = RNOneClickModule.class.getSimpleName();
    private PhoneNumberAuthHelper mPhoneNumberAuthHelper;
    private AuthPageConfig mUIConfig;
    private TokenResultListener mCheckListener;
    private TokenResultListener mTokenResultListener;
    private boolean sdkAvailable = true;
    private ProgressDialog mProgressDialog;
    private String errorMessage = "";
    private String authKey = null;

    public RNOneClickModule(ReactApplicationContext reactContext) {
        super(reactContext);
    }

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

    @ReactMethod
    public void initAuthSDKInfo(String initKey) {
        authKey = initKey;
        if (mCheckListener == null) {
            mCheckListener = new TokenResultListener() {
                @Override
                public void onTokenSuccess(String s) {
                    sdkAvailable = true;
                    Log.d(TAG, " initAuthSDKInfo success "+s);
                    try {
                        TokenRet pTokenRet = JSON.parseObject(s, TokenRet.class);
                        if (ResultCode.CODE_ERROR_ENV_CHECK_SUCCESS.equals(pTokenRet.getCode())) {
                            accelerateLoginPage(3000);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

                @Override
                public void onTokenFailed(String s) {
                    Log.d(TAG, " initAuthSDKInfo failed " + s);
                    sdkAvailable = false;
                    //终端环境检查失败之后 跳转到其他号码校验方式
                    try {
                        TokenRet pTokenRet = JSON.parseObject(s, TokenRet.class);
                        errorMessage = pTokenRet.getMsg();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            };
        }
        if (mPhoneNumberAuthHelper == null) {
            mPhoneNumberAuthHelper = PhoneNumberAuthHelper.getInstance(getCurrentActivity(), mCheckListener);
        }
        mPhoneNumberAuthHelper.getReporter().setLoggerEnable(true);
        mPhoneNumberAuthHelper.setAuthSDKInfo(initKey);
        mPhoneNumberAuthHelper.checkEnvAvailable(PhoneNumberAuthHelper.SERVICE_TYPE_LOGIN);
        mUIConfig = BaseUIConfig.init(Constant.UI_TYPE.CUSTOM_XML, getCurrentActivity(), mPhoneNumberAuthHelper);
        mUIConfig.setCall(new IOtherLogin() {
            @Override
            public void call(int way) {
                otherLogin(way);
            }
        });
    }


    public void otherLogin(int way) {
        WritableMap map = Arguments.createMap();
        map.putString("msg", errorMessage);
        map.putInt("way", way);
        getReactApplicationContext()
                .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                .emit("OTHERLOGIN", map);
    }

    @ReactMethod
    public void showFullPortraitLogin() {
        Log.d(TAG, " sdkAvailable : " + sdkAvailable);
        if (authKey != null && !sdkAvailable) {
            initAuthSDKInfo(authKey);
        }
        mUIConfig = BaseUIConfig.init(Constant.UI_TYPE.FULL_PORT, getCurrentActivity(), mPhoneNumberAuthHelper);
        mUIConfig.setCall(new IOtherLogin() {
            @Override
            public void call(int way) {
                otherLogin(way);
            }
        });
    }

    @ReactMethod
    public void showDialogBottomLogin() {
        Log.d(TAG, " sdkAvailable : " + sdkAvailable);
        if (authKey != null && !sdkAvailable) {
            initAuthSDKInfo(authKey);
        }
        mUIConfig = BaseUIConfig.init(Constant.UI_TYPE.DIALOG_BOTTOM, getCurrentActivity(), mPhoneNumberAuthHelper);
//        mUIConfig.setCall(new IOtherLogin() {
//            @Override
//            public void call(int way) {
//                otherLogin(way);
//            }
//        });
    }

    @ReactMethod
    public void showFullScreenLogin() {
        Log.d(TAG, " sdkAvailable : " + sdkAvailable);
        if (authKey != null && !sdkAvailable) {
            initAuthSDKInfo(authKey);
        }
        mUIConfig = BaseUIConfig.init(Constant.UI_TYPE.CUSTOM_XML, getCurrentActivity(), mPhoneNumberAuthHelper);
        mUIConfig.setCall(new IOtherLogin() {
            @Override
            public void call(int way) {
                otherLogin(way);
            }
        });
    }

    @ReactMethod
    public void showOneKeyLogin(ReadableMap readableMap) {
        Log.d(TAG, " sdkAvailable : " + sdkAvailable);
        if (authKey != null && !sdkAvailable) {
            initAuthSDKInfo(authKey);
        }
        if (sdkAvailable) {
            OneKeyConfig.REGISTER_PRIVACY_URL = getVal(readableMap, "registerPrivacyUrl");
            OneKeyConfig.PROTECT_PRIVACY_URL = getVal(readableMap, "protectPrivacyUrl");
            OneKeyConfig.LOGIN_BTN_TEXT = getVal(readableMap, "loginBtnText");
            OneKeyConfig.LOGIN_BTN_IMG = getVal(readableMap, "loginBtnImg");
            OneKeyConfig.MAIN_COLOR = getVal(readableMap, "loginBtnColor");
            configLoginTokenPort();
            getLoginToken(5000);
        } else {
            otherLogin(0);
            mUIConfig.release();
        }
    }

    public String getVal(ReadableMap readableMap, String key) {
        if (readableMap.hasKey(key)) {
            return readableMap.getString(key);
        }
        return "";
    }


    @Override
    public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {

    }

    @Override
    public void onNewIntent(Intent intent) {

    }

    /**
     * 在不是一进app就需要登录的场景 建议调用此接口 加速拉起一键登录页面
     * 等到用户点击登录的时候 授权页可以秒拉
     * 预取号的成功与否不影响一键登录功能，所以不需要等待预取号的返回。
     *
     * @param timeout
     */
    public void accelerateLoginPage(int timeout) {
        mPhoneNumberAuthHelper.accelerateLoginPage(timeout, new PreLoginResultListener() {
            @Override
            public void onTokenSuccess(String s) {
                Log.d(TAG, "预取号成功: " + s);
            }

            @Override
            public void onTokenFailed(String s, String s1) {
                Log.d(TAG, "预取号失败：" + ", " + s1);
            }
        });
    }

    /**
     * 配置竖屏样式
     */
    private void configLoginTokenPort() {
        mPhoneNumberAuthHelper.addAuthRegistViewConfig("switch_acc_tv", new AuthRegisterViewConfig.Builder()
                .setView(initDynamicView())
                .setRootViewId(AuthRegisterViewConfig.RootViewId.ROOT_VIEW_ID_BODY)
                .setCustomInterface(new CustomInterface() {
                    @Override
                    public void onClick(Context context) {
                        mPhoneNumberAuthHelper.quitLoginPage();
                    }
                }).build());
        int authPageOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT;
        if (Build.VERSION.SDK_INT == 26) {
            authPageOrientation = ActivityInfo.SCREEN_ORIENTATION_BEHIND;
        }
        int color = Color.parseColor("#002E00");
        if (!TextUtils.isEmpty(OneKeyConfig.MAIN_COLOR)) {
            color = Color.parseColor(OneKeyConfig.MAIN_COLOR);
        }
        mPhoneNumberAuthHelper.setAuthUIConfig(new AuthUIConfig.Builder()
                .setAppPrivacyOne("《吴秋强隐私协议》", "https://www.baidu.com")
                .setAppPrivacyColor(Color.GRAY, color)
                .setPrivacyState(false)
                .setCheckboxHidden(true)
                .setStatusBarColor(Color.TRANSPARENT)
                .setStatusBarUIFlag(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
                .setLightColor(true)
                .setAuthPageActIn("in_activity", "out_activity")
                .setAuthPageActOut("in_activity", "out_activity")
                .setVendorPrivacyPrefix("《")
                .setVendorPrivacySuffix("》")
                .setLogoImgPath("mytel_app_launcher")
                .setScreenOrientation(authPageOrientation)
                .create());
    }

    private View initDynamicView() {
        TextView switchTV = new TextView(getCurrentActivity());
        RelativeLayout.LayoutParams mLayoutParams2 = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, dp2px(getCurrentActivity(), 50));
        mLayoutParams2.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
        mLayoutParams2.setMargins(0, dp2px(getCurrentActivity(), 450), 0, 0);
        switchTV.setText("-----  自定义view  -----");
        switchTV.setTextColor(0xff999999);
        switchTV.setTextSize(TypedValue.COMPLEX_UNIT_SP, 13.0F);
        switchTV.setLayoutParams(mLayoutParams2);
        return switchTV;
    }

    /**
     * 拉起授权页
     *
     * @param timeout 超时时间
     */
    public void getLoginToken(int timeout) {
        mUIConfig.configAuthPage();
        mTokenResultListener = new TokenResultListener() {
            @Override
            public void onTokenSuccess(String s) {
                Log.i(TAG, "onTokenSuccess：");
                mPhoneNumberAuthHelper.hideLoginLoading();
//                hideLoadingDialog();
                TokenRet tokenRet = null;

                try {
                    tokenRet = JSON.parseObject(s, TokenRet.class);
                    Log.i(TAG, "oneKeyLogin：" + tokenRet.getCode());

                    if (ResultCode.CODE_START_AUTHPAGE_SUCCESS.equals(tokenRet.getCode())) {
                        Log.i(TAG, "唤起授权页成功：" + s);
                    }

                    if (ResultCode.CODE_GET_TOKEN_SUCCESS.equals(tokenRet.getCode())) {
                        Log.i(TAG, "获取token成功：" + s);
                        mPhoneNumberAuthHelper.quitLoginPage();
                        getResultWithToken(tokenRet.getToken());
                        mUIConfig.release();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onTokenFailed(String s) {
                Log.d(TAG, "获取token失败：" + s);
                mPhoneNumberAuthHelper.hideLoginLoading();
//                hideLoadingDialog();
                //如果环境检查失败 使用其他登录方式
                TokenRet tokenRet = null;
                try {
                    tokenRet = JSON.parseObject(s, TokenRet.class);
                    errorMessage = tokenRet.getMsg();
                    if (!ResultCode.CODE_ERROR_USER_CANCEL.equals(tokenRet.getCode())) {
                        otherLogin(0);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                mPhoneNumberAuthHelper.quitLoginPage();
                mUIConfig.release();
            }
        };
        mPhoneNumberAuthHelper.setAuthListener(mTokenResultListener);
        mPhoneNumberAuthHelper.getLoginToken(getCurrentActivity(), timeout);
//        showLoadingDialog("正在唤起授权页");
    }

    public void showLoadingDialog (String hint) {
        if (mProgressDialog == null) {
            mProgressDialog = new ProgressDialog(getCurrentActivity());
            mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        }
        mProgressDialog.setMessage(hint);
        mProgressDialog.setCancelable(true);
        mProgressDialog.show();
    }

    public void hideLoadingDialog() {
        Log.d(TAG, "hideLoadingDialog");
        if (mProgressDialog != null) {
            mProgressDialog.dismiss();
        }
    }

    public void getResultWithToken(final String token) {
        WritableMap map = Arguments.createMap();
        map.putString("token", token);
        this.getReactApplicationContext()
                .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                .emit("ONEKEYLOGIN", map);
    }
}
