package com.tramy.aliyunonepass;

import android.content.pm.ActivityInfo;
import android.graphics.Color;
import android.util.Log;

import androidx.annotation.NonNull;

import com.facebook.react.bridge.Promise;
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.module.annotations.ReactModule;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.mobile.auth.gatewayauth.AuthUIConfig;
import com.mobile.auth.gatewayauth.PhoneNumberAuthHelper;
import com.mobile.auth.gatewayauth.PreLoginResultListener;
import com.mobile.auth.gatewayauth.TokenResultListener;

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

@ReactModule(name = AliyunOnePassModule.NAME)
public class AliyunOnePassModule extends ReactContextBaseJavaModule {

    public static final String NAME = "AliyunOnePass";

    private static final int TIME_OUT = 7000;

    private static class RNTokenResultListener implements TokenResultListener {

        private final ReactApplicationContext reactContext;

        public RNTokenResultListener(ReactApplicationContext reactContext) {
            this.reactContext = reactContext;
        }

        @Override
        public void onTokenSuccess(String res) {
            reactContext
                .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                .emit("onVerifyResult", res);
        }

        @Override
        public void onTokenFailed(String res) {
            reactContext
                .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                .emit("onVerifyResult", res);
        }

    }

    private static class RNPreLoginResultListener implements PreLoginResultListener {

        @Override
        public void onTokenSuccess(String s) {
            Log.i(NAME, "prelogin success：" + s);
        }

        @Override
        public void onTokenFailed(String s, String s1) {
            Log.i(NAME, "prelogin error：" + s + "," + s1);
        }

    }

    private PhoneNumberAuthHelper authHelper;

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

    @Override
    @NonNull
    public String getName() {
        return NAME;
    }

    @Override
    public Map<String, Object> getConstants() {
        Map<String, Object> constants = new HashMap<>();
        constants.put("ON_VERIFY_RESULT", "onVerifyResult");
        constants.put("SUCCESS", "600000");
        constants.put("ENTER_COMPLETE", "600001");
        constants.put("ENTER_ERROR", "600002");
        constants.put("AVAILABLE", "600024");
        constants.put("NO_NET", "600008");
        constants.put("TIMEOUT", "600015");
        constants.put("GET_CODE_FAILED", "600012");
        constants.put("CANCEL", "700000");
        constants.put("SWITCH", "700001");
        constants.put("LOGIN", "700002");
        constants.put("CHECK", "700003");
        constants.put("PRIVACY", "700004");
        return constants;
    }

    @ReactMethod
    public void init(String secret,
                     Promise promise) {
        authHelper = PhoneNumberAuthHelper.getInstance(
            getReactApplicationContext().getApplicationContext(),
            new RNTokenResultListener(getReactApplicationContext()));
        authHelper.setAuthSDKInfo(secret);

        promise.resolve("");
    }

    @ReactMethod
    public void checkEnvAvailable() {
        authHelper.checkEnvAvailable(2);
    }

    @ReactMethod
    public void preLogin() {
        authHelper.accelerateLoginPage(TIME_OUT, new RNPreLoginResultListener());
    }

    @ReactMethod
    public void setAuthUIConfig(ReadableMap config,
                                Promise promise) {
        AuthUIConfig.Builder builder = new AuthUIConfig.Builder();
        authHelper.setAuthUIConfig(createConfig(builder, config));

        promise.resolve("");
    }

    @ReactMethod
    public void login(Promise promise) {
        authHelper.getLoginToken(
            getReactApplicationContext().getApplicationContext(),
            TIME_OUT);

        promise.resolve("");
    }

    @ReactMethod
    public void cancelLoading(Promise promise) {
        authHelper.hideLoginLoading();

        promise.resolve("");
    }

    @ReactMethod
    public void quit(Promise promise) {
        authHelper.quitLoginPage();

        promise.resolve("");
    }

    private AuthUIConfig createConfig(AuthUIConfig.Builder builder,
                                      ReadableMap config) {
        //导航栏
        if (config.hasKey("navColor")) {
            builder.setNavColor(Color.parseColor(config.getString("navColor")));
        }
        if (config.hasKey("navText")) {
            builder.setNavText(config.getString("navText"));
        }
        if (config.hasKey("navTextColor")) {
            builder.setNavTextColor(Color.parseColor(config.getString("navTextColor")));
        }
        if (config.hasKey("navTextSize")) {
            builder.setNavTextSizeDp(config.getInt("navTextSize"));
        }
        if (config.hasKey("navBackImgPath")) {
            builder.setNavReturnImgPath(config.getString("navBackImgPath"));
        }
        if (config.hasKey("navBackHidden")) {
            builder.setNavReturnHidden(config.getBoolean("navBackHidden"));
        }
        if (config.hasKey("navBackImgWidth")) {
            builder.setNavReturnImgWidth(config.getInt("navBackImgWidth"));
        }
        if (config.hasKey("navBackImgHeight")) {
            builder.setNavReturnImgHeight(config.getInt("navBackImgHeight"));
        }
        if (config.hasKey("navHidden")) {
            builder.setNavHidden(config.getBoolean("navHidden"));
        }
        if (config.hasKey("webNavColor")) {
            builder.setWebNavColor(Color.parseColor(config.getString("webNavColor")));
        }
        if (config.hasKey("webNavTextColor")) {
            builder.setWebNavTextColor(
              Color.parseColor(config.getString("webNavTextColor")));
        }
        if (config.hasKey("webNavTextSize")) {
            builder.setWebNavTextSizeDp(config.getInt("webNavTextSize"));
        }
        if (config.hasKey("webNavBackImgPath")) {
            builder.setWebNavReturnImgPath(config.getString("webNavBackImgPath"));
        }

        //状态栏
        if (config.hasKey("light")) {
            builder.setLightColor(config.getBoolean("light"));
        }

        //LOGO
        if (config.hasKey("logoImgPath")) {
            builder.setLogoImgPath(config.getString("logoImgPath"));
        }
        if (config.hasKey("logoHidden")) {
            builder.setLogoHidden(config.getBoolean("logoHidden"));
        }
        if (config.hasKey("logoWidth")) {
            builder.setLogoWidth(config.getInt("logoWidth"));
        }
        if (config.hasKey("logoHeight")) {
            builder.setLogoHeight(config.getInt("logoHeight"));
        }
        if (config.hasKey("logoOffsetTop")) {
            builder.setLogoOffsetY(config.getInt("logoOffsetTop"));
        }

        //slogan
        if (config.hasKey("sloganText")) {
            builder.setSloganText(config.getString("sloganText"));
        }
        if (config.hasKey("sloganTextColor")) {
            builder.setSloganTextColor(
              Color.parseColor(config.getString("sloganTextColor")));
        }
        if (config.hasKey("sloganTextSize")) {
            builder.setSloganTextSizeDp(config.getInt("sloganTextSize"));
        }
        if (config.hasKey("sloganOffsetTop")) {
            builder.setSloganOffsetY(config.getInt("sloganOffsetTop"));
        }

        //掩码
        if (config.hasKey("numberColor")) {
            builder.setNumberColor(Color.parseColor(config.getString("numberColor")));
        }
        if (config.hasKey("numberSize")) {
            builder.setNumberSizeDp(config.getInt("numberSize"));
        }
        if (config.hasKey("numberOffsetTop")) {
            builder.setNumFieldOffsetY(config.getInt("numberOffsetTop"));
        }

        //登录按钮
        if (config.hasKey("btnText")) {
            builder.setLogBtnText(config.getString("btnText"));
        }
        if (config.hasKey("btnTextColor")) {
            builder.setLogBtnTextColor(
              Color.parseColor(config.getString("btnTextColor")));
        }
        if (config.hasKey("btnTextSize")) {
            builder.setLogBtnTextSizeDp(config.getInt("btnTextSize"));
        }
        if (config.hasKey("btnWidth")) {
            builder.setLogBtnWidth(config.getInt("btnWidth"));
        }
        if (config.hasKey("btnHeight")) {
            builder.setLogBtnHeight(config.getInt("btnHeight"));
        }
        if (config.hasKey("btnOffsetTop")) {
            builder.setLogBtnOffsetY(config.getInt("btnOffsetTop"));
        }
        if (config.hasKey("btnBackgroundImgPath")) {
            builder.setLogBtnBackgroundPath(
              config.getString("btnBackgroundImgPath"));
        }

        builder.setHiddenLoading(false);

        //切换其他方式
        if (config.hasKey("switchAccHidden")) {
            builder.setSwitchAccHidden(config.getBoolean("switchAccHidden"));
        }
        if (config.hasKey("switchAccText")) {
            builder.setSwitchAccText(config.getString("switchAccText"));
        }
        if (config.hasKey("switchAccTextColor")) {
            builder.setSwitchAccTextColor(
              Color.parseColor(config.getString("switchAccTextColor")));
        }
        if (config.hasKey("switchAccTextSize")) {
            builder.setSwitchAccTextSizeDp(config.getInt("switchAccTextSize"));
        }
        if (config.hasKey("switchOffsetTop")) {
            builder.setSwitchOffsetY(config.getInt("switchOffsetTop"));
        }

        //协议
        if (config.hasKey("privacyOneName")
                && config.hasKey("privacyOneURL")) {
            builder.setAppPrivacyOne(
              config.getString("privacyOneName"),
              config.getString("privacyOneURL"));
        }
        if (config.hasKey("privacyTwoName")
                && config.hasKey("privacyTwoURL")) {
            builder.setAppPrivacyTwo(
              config.getString("privacyTwoName"),
              config.getString("privacyTwoURL"));
        }
        if (config.hasKey("privacyThreeName")
                && config.hasKey("privacyThreeURL")) {
            builder.setAppPrivacyThree(
              config.getString("privacyThreeName"),
              config.getString("privacyThreeURL"));
        }
        if (config.hasKey("privacyColor")
                && config.hasKey("privacyLightColor")) {
            builder.setAppPrivacyColor(
              Color.parseColor(config.getString("privacyColor")),
              Color.parseColor(config.getString("privacyLightColor")));
        }
        if (config.hasKey("privacyOffsetTop")) {
            builder.setPrivacyOffsetY(config.getInt("privacyOffsetTop"));
        }
        if (config.hasKey("privacyBefore")) {
            builder.setPrivacyBefore(config.getString("privacyBefore"));
        }
        if (config.hasKey("privacyEnd")) {
            builder.setPrivacyEnd(config.getString("privacyEnd"));
        }

        if (config.hasKey("checkedImgPath")) {
            builder.setCheckedImgPath(config.getString("checkedImgPath"));
        }
        if (config.hasKey("unCheckedImgPath")) {
            builder.setUncheckedImgPath(config.getString("unCheckedImgPath"));
        }

        if (config.hasKey("vendorPrivacyPrefix")) {
            builder.setVendorPrivacyPrefix(config.getString("vendorPrivacyPrefix"));
        }
        if (config.hasKey("vendorPrivacySuffix")) {
            builder.setVendorPrivacySuffix(config.getString("vendorPrivacySuffix"));
        }

        //当前只支持竖屏使用授权页
        builder.setScreenOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        return builder.create();
    }

}
