package com.sgmwsales.plugins;

import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.chuanglan.shanyan_sdk.OneKeyLoginManager;
import com.chuanglan.shanyan_sdk.listener.GetPhoneInfoListener;
import com.chuanglan.shanyan_sdk.listener.InitListener;
import com.chuanglan.shanyan_sdk.listener.OneKeyLoginListener;
import com.chuanglan.shanyan_sdk.listener.OpenLoginAuthListener;
import com.chuanglan.shanyan_sdk.tool.ShanYanUIConfig;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

/**
 * This class echoes a string called from JavaScript.
 */
public class OneKeyLogin extends CordovaPlugin {

    private FakeR fakeR;

    @Override
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
        fakeR = new FakeR(cordova.getContext());
        if (action.equals("openLogin")) {
            cordova.getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    init(callbackContext);
                }
            });
            return true;
        }
        return false;
    }

    private void init(CallbackContext callbackContext) {

        OneKeyLoginManager.getInstance().init(cordova.getContext(), getAppKey(callbackContext), new InitListener() {
            @Override
            public void getInitStatus(int code, String result) {
                if (code == 1022) {
                    setPageConfig(callbackContext);
                    getPhoneInfo(callbackContext);
                } else {
                    callbackContext.error(errMsg(result));
                }
            }
        });
    }

    private void getPhoneInfo(CallbackContext callbackContext) {
        OneKeyLoginManager.getInstance().getPhoneInfo(new GetPhoneInfoListener() {
            @Override
            public void getPhoneInfoStatus(int code, String result) {
                cordova.getActivity().getWindow().getDecorView().postDelayed(() -> {
                    if (code == 1022) {
                        openLoginAuth(callbackContext);
                    } else {
                        callbackContext.error(errMsg(result));
                    }
                }, 1000);
            }
        });
    }

    private void openLoginAuth(CallbackContext callbackContext) {
        OneKeyLoginManager.getInstance().openLoginAuth(true, new OpenLoginAuthListener() {
            @Override
            public void getOpenLoginAuthStatus(int code, String result) {
                if (code != 1000){
                    callbackContext.error(errMsg(result));
                }
            }
        }, new OneKeyLoginListener() {
            @Override
            public void getOneKeyLoginStatus(int code, String result) {
                if (code == 1000) {
                    OneKeyLoginManager.getInstance().setLoadingVisibility(false);
                    JsonParser parser = new JsonParser();
                    JsonObject jsonObject = parser.parse(result).getAsJsonObject();
                    callbackContext.success(successMsg(0, "success", jsonObject.get("token").getAsString()));
                    OneKeyLoginManager.getInstance().finishAuthActivity();
                } else {
                    callbackContext.error(errMsg(result));
                }
            }
        });
    }

    private void setPageConfig(CallbackContext callbackContext) {

        ShanYanUIConfig.Builder shanYanBuilder = new ShanYanUIConfig.Builder();
        shanYanBuilder.setVirtualKeyTransparent(true);
        shanYanBuilder.setAuthNavHidden(true);
        //服务认证
        shanYanBuilder.setSloganHidden(true);//隐藏服务认证
        shanYanBuilder.setShanYanSloganHidden(true);//隐藏胜蓝服务认证
        //logo图片
        shanYanBuilder.setLogoImgPath(cordova.getContext().getResources().getDrawable(fakeR.getId("drawable", "shanyan_logo")));
        shanYanBuilder.setLogoOffsetY(115);
        //用户电话
        shanYanBuilder.setNumberSize(20);//号码字体大小
        shanYanBuilder.setNumFieldOffsetY(210);
        //一键登录按钮
        shanYanBuilder.setLogBtnOffsetY(318);
        shanYanBuilder.setLogBtnText("一键登录");//设置登录按钮文字
        shanYanBuilder.setLogBtnTextSize(15);//设置登录按钮字体大小
        shanYanBuilder.setLogBtnHeight(48);
        shanYanBuilder.setLogBtnWidth(268);
        shanYanBuilder.setLogBtnImgPath(cordova.getContext().getResources().getDrawable(fakeR.getId("drawable", "drawable_bg_log_btn")));
        //其他登录方式按钮
        LinearLayout linearLayout = new LinearLayout(cordova.getContext());
        linearLayout.setGravity(Gravity.CENTER_HORIZONTAL);
        TextView otherBtn = new TextView(cordova.getContext());
        otherBtn.setText("其他登录方式");
        otherBtn.setPadding(30, 10, 30, 10);
        otherBtn.setTextColor(Color.parseColor("#485CC7"));
        otherBtn.setOnClickListener(v -> {
            callbackContext.success(successMsg(1, "btn_other_login", null));
            OneKeyLoginManager.getInstance().finishAuthActivity();
        });
        linearLayout.addView(otherBtn);
        shanYanBuilder.setRelativeCustomView(linearLayout, false, 0, 40, 0, 0, (context, view) -> {
        });
        //设置隐私协议
        shanYanBuilder.setCheckBoxHidden(true);
        shanYanBuilder.setPrivacyTextSize(12);
        shanYanBuilder.setPrivacyText("营销通行证\n畅通SGMW营销服务，在众多产品中直接使用\n免去重复注册、重复登录的步骤\n", "", "", "", "");

        OneKeyLoginManager.getInstance().setAuthThemeConfig(shanYanBuilder.build(), shanYanBuilder.build());
    }

    private String successMsg(int code, String err, String data) {
        return genMsg(code, err, data);
    }

    private String errMsg(String err) {
        return genMsg(-1, err, null);
    }

    private String genMsg(int code, String err, String data) {
        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject.put("code", code);
            jsonObject.put("err", err);
            jsonObject.put("data", data);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return jsonObject.toString();
    }

    private String getAppKey(CallbackContext callbackContext) {
        try {
            ApplicationInfo applicationInfo = cordova.getActivity().getPackageManager().getApplicationInfo(cordova.getActivity().getPackageName(), PackageManager.GET_META_DATA);
            Bundle applicationMetaData = applicationInfo.metaData;
            return applicationMetaData.getString("com.chuanglan.shanyan_sdk.appkey");
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        callbackContext.error(errMsg("notFoundKey"));
        return "notFoundKey";
    }
}
