package com.aloestec.moxie;

import android.app.Application;
import android.support.annotation.Nullable;
import android.util.Log;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.moxie.client.exception.ExceptionType;
import com.moxie.client.exception.MoxieException;
import com.moxie.client.manager.MoxieCallBack;
import com.moxie.client.manager.MoxieCallBackData;
import com.moxie.client.manager.MoxieContext;
import com.moxie.client.manager.MoxieSDK;
import com.moxie.client.model.MxParam;
import com.moxie.client.model.TitleParams;

public class DBJsModule extends ReactContextBaseJavaModule {
    private ReactApplicationContext applicationContext;

    public DBJsModule(ReactApplicationContext reactContext) {
        super(reactContext);
        this.applicationContext = reactContext;
    }

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

    /**
     * 初始化
     *
     * @param userId 客户ID
     * @param apiKey apiKey
     */
    @ReactMethod
    public void initial(String userId, String apiKey, String phone, String userName, String idcard, String themeColor) {
        if (StaticUtil.stringVerify(userId, apiKey)) {
            StaticUtil.userId = userId;
            StaticUtil.apiKey = apiKey;
            StaticUtil.phone = phone;
            StaticUtil.userName = userName;
            StaticUtil.idcard = idcard;
            StaticUtil.themeColor = themeColor;
            MoxieSDK.init((Application) applicationContext.getApplicationContext());
        }
    }

    /**
     * 要调用的功能字符串
     */
    @ReactMethod
    public void start(final String taskType) {
        final MxParam mxParam = new MxParam();
        mxParam.setUserId(StaticUtil.userId);
        mxParam.setApiKey(StaticUtil.apiKey);
        mxParam.setTaskType(taskType);
        mxParam.setThemeColor(StaticUtil.themeColor);
        mxParam.setCacheDisable(MxParam.PARAM_COMMON_YES);
        mxParam.setQuitOnFail(MxParam.PARAM_COMMON_YES);
        mxParam.setPhone(StaticUtil.phone);
        mxParam.setName(StaticUtil.userName);
        mxParam.setIdcard(StaticUtil.idcard);
        mxParam.setQuitLoginDone(MxParam.PARAM_COMMON_YES);
        TitleParams titleParams = new TitleParams.Builder()
                .leftNormalImgResId(R.drawable.moxie_client_banner_back_black)
                .leftPressedImgResId(R.drawable.moxie_client_banner_back_black)
                .titleColor(applicationContext.getApplicationContext().getResources().getColor(R.color.colorBlack))
                .backgroundColor(applicationContext.getApplicationContext().getResources().getColor(R.color.colorWhite))
                .rightNormalImgResId(R.drawable.moxie_client_banner_refresh_black)
                .immersedEnable(true)
                .build();
        mxParam.setTitleParams(titleParams);
        applicationContext.getCurrentActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                MoxieSDK.getInstance().start(applicationContext.getCurrentActivity(), mxParam, new MoxieCallBack() {
                    @Override
                    public boolean callback(MoxieContext moxieContext, MoxieCallBackData moxieCallBackData) {
                        Log.i("moxie call back", "moxie call back");
                        if (moxieCallBackData != null) {
                            WritableMap params = Arguments.createMap();
                            switch (moxieCallBackData.getCode()) {
                                case MxParam.ResultCode.IMPORT_UNSTART:
                                    params.putString("type", "cancel");
                                    sendEvent(applicationContext, "moxieFetchFail", params);
                                    break;
                                case MxParam.ResultCode.IMPORT_SUCCESS:
                                case MxParam.ResultCode.IMPORTING:
                                    if (moxieCallBackData.isLoginDone()) {
                                        //任务已经登录成功，发送给客户端一个回调
                                        params.putString("taskType", taskType);
                                        params.putString("taskId", moxieCallBackData.getTaskId());
                                        sendEvent(applicationContext, "moxieFetchSuccess", params);
                                        moxieContext.finish();
                                    }else {
                                         params.putString("type", "cancel");
                                         params.putString("taskId", moxieCallBackData.getTaskId());
                                         sendEvent(applicationContext, "moxieFetchFail", params);
                                     }
                                    break;
                                default:
                                    params.putString("type", "fail");
                                    params.putString("taskId", moxieCallBackData.getTaskId());
                                    sendEvent(applicationContext, "moxieFetchFail", params);
                                    break;
                            }
                        } else {
                            WritableMap params = Arguments.createMap();
                            params.putString("type", "fail");
                            params.putString("taskId", moxieCallBackData.getTaskId());
                            sendEvent(applicationContext, "moxieFetchFail", params);
                        }
                        return super.callback(moxieContext, moxieCallBackData);
                    }

                    @Override
                    public void onError(MoxieContext moxieContext, MoxieException moxieException) {
                        super.onError(moxieContext, moxieException);
                    }
                });
            }
        });
    }

    private void sendEvent(ReactContext reactContext,
                           String eventName,
                           @Nullable WritableMap params) {
        reactContext
                .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                .emit(eventName, params);
    }

    @Override
    public boolean canOverrideExistingModule() {
        return true;
    }
}
