package com.getui.reactnativegetui;

import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.widget.Toast;

import com.facebook.react.bridge.Arguments;
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.WritableMap;

import com.g.gysdk.GYManager;
import com.g.gysdk.GyConfig;
import com.g.gysdk.GyCallBack;
import com.g.gysdk.GYResponse;
import com.g.gysdk.EloginActivityParam;

/**
 * Created by zhourh on 2017/3/6.
 */
public class GetuiGyModule extends ReactContextBaseJavaModule {

    private static final String TAG = "GetuiGyModule";
    private ReactApplicationContext mRAC;
    private Integer preLoginTimeout;
    private Integer eloginTimeout;
    private boolean debug = false;
    private GYResponse gyResponse;

    public GetuiGyModule(ReactApplicationContext reactContext) {
        super(reactContext);
        mRAC = reactContext;
    }

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

    @ReactMethod
    public void startSdk(String appid, Callback callback) {
        GYManager.getInstance().preInit(mRAC.getApplicationContext());

        GyConfig gyConfig = GyConfig.with(mRAC.getApplicationContext())
                .preLoginUseCache(true)
                .debug(GetuiGyModule.this.debug)
                .eLoginDebug(false)
                .callBack(new GyCallBack() {
                    @Override
                    public void onSuccess(GYResponse response) {
                        callback.invoke(true, response.getGyuid());
                    }

                    @Override
                    public void onFailed(GYResponse response) {
                        callback.invoke(false, response.getMsg());
                    }
                }).build();

        GYManager.getInstance().init(gyConfig);
    }

    @ReactMethod
    public void gtcid(Callback callback) {
        if (gyResponse != null) {
            callback.invoke(gyResponse.getGyuid());
        } else {
            callback.invoke("请先预登录");
        }
    }

    @ReactMethod
    public void version(Callback callback) {
        callback.invoke(GYManager.getInstance().getVersion());
    }

    @ReactMethod
    public void setDebug(boolean isEnable) {
        this.debug = isEnable;
        GYManager.getInstance().setDebug(isEnable);
    }

    @ReactMethod
    public void setPreLoginTimeout(int timeout) {
        this.preLoginTimeout = timeout;
    }

    @ReactMethod
    public void setEloginTimeout(int timeout) {
        this.eloginTimeout = timeout;
    }

    @ReactMethod
    public void currentNetworkInfo(Callback callback) {
        callback.invoke(createErrorResult(-100, "Android不支持"));
    }

    @ReactMethod
    public void deletePreResultCache() {
        // 暂无实现
    }

    @ReactMethod
    public void currentCarrierCount(Callback callback) {
        callback.invoke(GYManager.getInstance().getSimCount(mRAC));
    }

    @ReactMethod
    public void isPreGettedTokenValidate(Callback callback) {
        boolean isValid = GYManager.getInstance().isPreLoginResultValid();
        callback.invoke(isValid);
    }

    @ReactMethod
    public void preGetToken(Callback callback) {
        Toast.makeText(mRAC, "preGetToken", Toast.LENGTH_SHORT).show();
        GYManager.getInstance().ePreLogin(this.preLoginTimeout == null ? 8000 : this.preLoginTimeout, new GyCallBack() {
            @Override
            public void onSuccess(GYResponse response) {
                new Handler(Looper.getMainLooper()).post(() -> {
                    GetuiGyModule.this.gyResponse = response;
                    WritableMap result = toStandardJSON(response);
                    Log.d(TAG, "preGetToken onSuccess: " + result.toString());
                    callback.invoke(result);
                    Toast.makeText(mRAC, "preGetToken onSuccess", Toast.LENGTH_SHORT).show();
                });
            }

            @Override
            public void onFailed(GYResponse response) {
                new Handler(Looper.getMainLooper()).post(() -> {
                    WritableMap result = toStandardJSON(response);
                    Log.d(TAG, "preGetToken onFailed: " + result.toString());
                    callback.invoke(result);
                    Toast.makeText(mRAC, "preGetToken onFailed", Toast.LENGTH_SHORT).show();
                });
            }
        });
    }

    @ReactMethod
    public void login(Callback callback) {
        Toast.makeText(mRAC, "login", Toast.LENGTH_SHORT).show();
        GYManager.getInstance().login((this.eloginTimeout == null ? 8000 : eloginTimeout), null, new GyCallBack() {
            @Override
            public void onSuccess(GYResponse response) {
                new Handler(Looper.getMainLooper()).post(() -> {
                    WritableMap result = toStandardJSON(response);
                    Log.d(TAG, "login onSuccess: " + result.toString());
                    callback.invoke(true, result, response.getMsg());
                    Toast.makeText(mRAC, "login onSuccess", Toast.LENGTH_SHORT).show();
                });
            }

            @Override
            public void onFailed(GYResponse response) {
                new Handler(Looper.getMainLooper()).post(() -> {
                    WritableMap result = toStandardJSON(response);
                    Log.d(TAG, "login onFailed: " + result.toString());
                    callback.invoke(true, result, response.getMsg());
                    Toast.makeText(mRAC, "login onFailed", Toast.LENGTH_SHORT).show();
                });
            }
        });
    }

    @ReactMethod
    public void getPhoneVerifyToken(String phoneNumber, Callback callback) {
        GYManager.getInstance().getVerifyToken(phoneNumber, 8000, new GyCallBack() {
            @Override
            public void onSuccess(GYResponse response) {
                new Handler(Looper.getMainLooper()).post(() -> {
                  callback.invoke(true, response.getCode(), response.getMsg());
                });
            }

            @Override
            public void onFailed(GYResponse response) {
                new Handler(Looper.getMainLooper()).post(() -> {
                 callback.invoke(false, response.getCode(), response.getMsg());
                });
            }
        });
    }

    @ReactMethod
    public void checkPhoneNumber(String phoneNumber, Callback callback) {
        GYManager.getInstance().getVerifyToken(phoneNumber, 8000, new GyCallBack() {
            @Override
            public void onSuccess(GYResponse response) {
                new Handler(Looper.getMainLooper()).post(() -> {
                 callback.invoke(true, response.getCode(), response.getMsg());
                });
            }

            @Override
            public void onFailed(GYResponse response) {
                new Handler(Looper.getMainLooper()).post(() -> {
                  callback.invoke(false, response.getCode(), response.getMsg());
                });
            }
        });
    }

    /**
     * 创建成功响应的 WritableMap 对象
     */
    private WritableMap createSuccessResult(GYResponse gyResponse) {
        return createSuccessResult(null, gyResponse);
    }

    /**
     * 创建带类型的成功响应的 WritableMap 对象
     */
    private WritableMap createSuccessResult(String type, GYResponse gyResponse) {
        WritableMap map = Arguments.createMap();
        try {
            map.putInt("result", 1);
            if (type != null) {
                map.putString("type", type);
            }
            if (gyResponse != null) {
                map.putMap("data", toStandardJSON(gyResponse));
            }
        } catch (Exception e) {
            Log.e(TAG, "createSuccessResult error: ", e);
        }
        return map;
    }

    /**
     * 创建标准格式的 WritableMap 响应对象
     */
    private WritableMap toStandardJSON(GYResponse response) {
        WritableMap map = Arguments.createMap();
        try {
            map.putString("gyuid", response.getGyuid() != null ? response.getGyuid() : "");
            map.putBoolean("success", response.isSuccess());
            map.putInt("code", response.getCode());
            map.putString("operator", response.getOperator() != null ? response.getOperator() : "");
            map.putString("msg", response.getMsg() != null ? response.getMsg() : "");
        } catch (Exception e) {
            Log.e(TAG, "toStandardJSON error: ", e);
        }
        return map;
    }

    /**
     * 根据 GYResponse 创建错误响应的 WritableMap 对象
     */
    private WritableMap createErrorResult(GYResponse gyResponse) {
        WritableMap map = Arguments.createMap();
        try {
            map.putInt("result", 0);
            map.putMap("data", toStandardJSON(gyResponse));
        } catch (Exception e) {
            Log.e(TAG, "createErrorResult error: ", e);
        }
        return map;
    }

    /**
     * 创建错误响应的 WritableMap 对象（带错误码和消息）
     */
    private WritableMap createErrorResult(int code, String message) {
        WritableMap map = Arguments.createMap();
        try {
            map.putInt("result", 0);
            map.putString("type", "error");
            map.putString("msg", message);
            map.putInt("code", code);
        } catch (Exception e) {
            Log.e(TAG, "createErrorResult error: ", e);
        }
        return map;
    }
}