package com.rnoneclick;

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.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.alibaba.fastjson.JSON;
import com.facebook.common.activitylistener.BaseActivityListener;
import com.facebook.react.bridge.ActivityEventListener;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
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.uitls.ExecutorManager;

import static com.rnoneclick.AppUtils.dp2px;
import static com.rnoneclick.Constant.LOGIN_KEY;
import static com.rnoneclick.uitls.MockRequest.getPhoneNumber;

public class RNOneClickModule extends ReactContextBaseJavaModule implements ActivityEventListener {

    private PhoneNumberAuthHelper mPhoneNumberAuthHelper;
    private AuthPageConfig mUIConfig;
    private TokenResultListener mCheckListener;
    private TokenResultListener mTokenResultListener;
    private boolean sdkAvailable = true;
    private ProgressDialog mProgressDialog;

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

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

    @ReactMethod
    public void initSdk() {
        mCheckListener = new TokenResultListener() {
            @Override
            public void onTokenSuccess(String s) {
                Log.d("成功了", 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("失败了", s);
                sdkAvailable = false;
                //终端环境检查失败之后 跳转到其他号码校验方式
            }
        };
        mPhoneNumberAuthHelper = PhoneNumberAuthHelper.getInstance(getCurrentActivity(), mCheckListener);
        mPhoneNumberAuthHelper.checkEnvAvailable(PhoneNumberAuthHelper.SERVICE_TYPE_LOGIN);
        mUIConfig = BaseUIConfig.init(Constant.UI_TYPE.DIALOG_BOTTOM, getCurrentActivity(), mPhoneNumberAuthHelper);
        mPhoneNumberAuthHelper.setAuthSDKInfo("7KHffk2Cn1j17+QVA2zbJfdDteDSUDspB/s+FUoAhyXmQ/wueAQBcpMDOVLrp5lt5BDIGxDrCuTBZk7TcR4CxAQvHnJUPIaCI5dscbBFqHgHVI8Yoy0nYwsFo8Gyd2RZ6MbUAZr3lsnPQsA+UW1MZY9EP94x0TrXmwEJkU5xJgmOJfCSekYWHP5xNc0as/aWkTmNrjFyb5//93cAMwQllH0FFEFF+GEd7XMvm6ap/g4BD8676+z29MbePXPjoY6u3VrNTMkksQHW1EolxJkw+y1FhIxpm9II");
    }

    @ReactMethod
    public void login() {
        if (sdkAvailable) {
            configLoginTokenPort();
            getLoginToken(5000);
        } else {
            //如果环境检查失败 使用其他登录方式
            Intent pIntent = new Intent(getCurrentActivity(), MessageActivity.class);
            getCurrentActivity().startActivityForResult(pIntent, 1002);
            mUIConfig.release();
        }
    }

    @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.e("", "预取号成功: " + s);
            }

            @Override
            public void onTokenFailed(String s, String s1) {
                Log.e("", "预取号失败：" + ", " + 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;
        }
        mPhoneNumberAuthHelper.setAuthUIConfig(new AuthUIConfig.Builder()
                .setAppPrivacyOne("《吴秋强隐私协议》", "https://www.baidu.com")
                .setAppPrivacyColor(Color.GRAY, Color.parseColor("#002E00"))
                .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) {
                hideLoadingDialog();
                TokenRet tokenRet = null;
                try {
                    tokenRet = JSON.parseObject(s, TokenRet.class);
                    if (ResultCode.CODE_START_AUTHPAGE_SUCCESS.equals(tokenRet.getCode())) {
                        Log.i("", "唤起授权页成功：" + s);
                    }

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


            }

            @Override
            public void onTokenFailed(String s) {
                Log.e("", "获取token失败：" + s);
                hideLoadingDialog();
                //如果环境检查失败 使用其他登录方式
                TokenRet tokenRet = null;
                try {
                    tokenRet = JSON.parseObject(s, TokenRet.class);
                    if (!ResultCode.CODE_ERROR_USER_CANCEL.equals(tokenRet.getCode())) {
                        Toast.makeText(getCurrentActivity(), "一键登录失败切换到其他登录方式", Toast.LENGTH_SHORT).show();
                        Intent pIntent = new Intent(getCurrentActivity(), MessageActivity.class);
                        getCurrentActivity().startActivityForResult(pIntent, 1002);
                    }
                } 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() {
        if (mProgressDialog != null) {
            mProgressDialog.dismiss();
        }
    }

    public void getResultWithToken(final String token) {
        ExecutorManager.run(new Runnable() {
            @Override
            public void run() {
                final String result = getPhoneNumber(token);
                getCurrentActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
//                        mTvResult.setText("登陆成功：" + result);
//                        mLoginBtn.setVisibility(View.INVISIBLE);
                        mPhoneNumberAuthHelper.quitLoginPage();
                    }
                });
            }
        });
    }
}
