package com.moonmiles.bridge.apm.service;

import android.content.Context;

import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.WritableMap;
import com.moonmiles.apm.sdk.service.APMUIServicesUser;
import com.moonmiles.apmservices.model.APMUser;
import com.moonmiles.apmservices.net.APMException;
import com.moonmiles.apmservices.sdk.user.APMUserConnectListener;
import com.moonmiles.apmservices.sdk.user.APMUserLogoutListener;
import com.moonmiles.bridge.apm.APMConstants;
import com.moonmiles.bridge.apm.abs.APMReactContextBaseJavaModule;
import com.moonmiles.bridge.apm.utils.APMBridgeUtils;

import org.json.JSONObject;

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

public class APMUIServicesUserModule extends APMReactContextBaseJavaModule
{

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

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

    @Override
    public Map<String, Object> getConstants()
    {
        final Map<String, Object> constants = new HashMap<>();
        return constants;
    }

    @ReactMethod
    public void userClientConnect(final String firstname, String lastname, String email, String password, String facebookId, String partnerClientId, String oldClientId, ReadableMap segments, final Promise promise)
    {
        try
        {
            Context context = getContextFromModule(promise);
            if(context != null)
            {
                HashMap hashSegments = null;
                if(segments != null)
                { hashSegments = segments.toHashMap(); }

                APMUIServicesUser.userClientConnect(context, firstname, lastname, email, password, facebookId, partnerClientId, oldClientId, hashSegments, new APMUserConnectListener()
                {

                    @Override
                    public void userConnectSuccess(APMUser user)
                    {
                        String userstring = APMBridgeUtils.createDefaultGson().toJson(user);
                        try
                        {
                            JSONObject userjson = new JSONObject(userstring);
                            WritableMap params = APMBridgeUtils.convertJsonToMap(userjson);
                            promise.resolve(params);
                        }
                        catch(Exception e)
                        {
                            e.printStackTrace();
                            promise.reject(APMConstants.ERROR_UNKNOWN, e.getLocalizedMessage());
                        }
                    }

                    @Override
                    public void failure(APMException e)
                    {
                        promise.reject(e.errorCode + "", e.errorMessage);
                    }
                });
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
            promise.reject(APMConstants.ERROR_UNKNOWN, e.getLocalizedMessage());
        }
    }

    @ReactMethod
    public void userLogout(final Promise promise)
    {
        try
        {
            Context context = getContextFromModule(promise);
            if(context != null)
            {
                APMUIServicesUser.userLogout(context, new APMUserLogoutListener()
                {
                    @Override
                    public void userLogoutSuccess()
                    {
                        promise.resolve(null);
                    }

                    @Override
                    public void failure(APMException e)
                    {
                        promise.reject(e.errorCode + "", e.errorMessage);
                    }
                });
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
            promise.reject(APMConstants.ERROR_UNKNOWN, e.getLocalizedMessage());
        }
    }
}
