package com.moonmiles.bridge.apm;

import android.app.Activity;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.WritableMap;
import com.moonmiles.apm.sdk.APM;
import com.moonmiles.apm.sdk.APMOnBadgeClickListener;
import com.moonmiles.apm.sdk.APMPublic;
import com.moonmiles.apmservices.animations.anims_interface.APMAnimationListener;
import com.moonmiles.bridge.apm.abs.APMReactContextBaseJavaModule;
import com.moonmiles.bridge.apm.utils.APMBridgeUtils;

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

public class APMModule extends APMReactContextBaseJavaModule
{
    private static final String EVENT_ON_BADGE_CLICK = "onBadgeClick";

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

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

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

    //Init
    @ReactMethod
    public void initAppWithPartnerID(String partnerID, String partnerSecret)
    {
        APM apm = getAPM();
        if(apm != null)
        {
            apm.initApp(partnerID, partnerSecret);
        }
    }

    @ReactMethod
    public void initAppWithAppID(String partnerID, String partnerSecret, String appId)
    {
        APM apm = getAPM();
        if(apm != null)
        {
            apm.initApp(partnerID, partnerSecret, appId);
        }
    }

    //Cycle de vie
    @ReactMethod
    public void refreshSDK()
    {
        Activity activity = getCurrentActivity();
        APM apm = getAPM();
        if(apm != null && activity != null)
        {
            apm.onResume(activity, activity.getIntent());
        }
    }

    //Services
    @ReactMethod
    public void removeActionWithActionName(String actionName)
    {
        APM apm = getAPM();
        if(apm != null)
        {
            apm.removeAction(actionName);
        }
    }

    @ReactMethod
    public void selectClassID(String classID)
    {
        APM apm = getAPM();
        if(apm != null)
        {
            apm.selectClassID(classID);
        }
    }

    @ReactMethod
    public void triggerAction(String actionName)
    {
        APM apm = getAPM();
        if(apm != null)
        {
            apm.triggerAction(actionName);
        }
    }

    //Badge
    @ReactMethod
    public void showBadge()
    {
        APM apm = getAPM();
        if(apm != null)
        {
            apm.showBadge();
        }
    }

    @ReactMethod
    public void hideBadge()
    {
        APM apm = getAPM();
        if(apm != null)
        {
            apm.hideBadge();
        }
    }

    @ReactMethod
    public void setOnBadgeClickListener(final int badge)
    {
        try
        {
            if(badge == 0)
                APMPublic.sharedInstanceBadgeManager().setOnBadgeClickListener(null);
            else
            {
                APMPublic.sharedInstanceBadgeManager().setOnBadgeClickListener(new APMOnBadgeClickListener()
                {
                    @Override
                    public boolean onBadgeClick(int i)
                    {
                        ReactContext context = getReactApplicationContext();
                        if(context != null)
                        {
                            WritableMap params = Arguments.createMap();
                            params.putInt("badge", i);
                            APMBridgeUtils.sendEvent(context, EVENT_ON_BADGE_CLICK, params);

                            if(badge == i)
                                return true;
                        }
                        return false;
                    }
                });
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

    //Big Badge
    @ReactMethod
    public void isOpenBigBadge(Promise promise)
    {
        APM apm = getAPM(promise);
        if(apm != null)
        {
            promise.resolve(apm.isOpenBigBadge());
        }
    }

    @ReactMethod
    public void openBigBadge()
    {
        APM apm = getAPM();
        if(apm != null)
        {
            apm.openBigBadge();
        }
    }

    @ReactMethod
    public void closeBigBadge(final Promise promise)
    {
        try
        {
            APM apm = getAPM(promise);
            if(apm != null)
            {
                apm.closeBigBadge(new APMAnimationListener()
                {
                    @Override
                    public void onAnimationEnd()
                    {
                        if(promise != null)
                        { promise.resolve(null); }
                    }
                });
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
            promise.reject(APMConstants.ERROR_UNKNOWN, e.getLocalizedMessage());
        }
    }

    //Getter and Setter
    @ReactMethod
    public void setBaseUrl(String baseUrl)
    {
        APM apm = getAPM();
        if(apm != null)
        {
            apm.setBaseUrl(baseUrl);
        }
    }

    @ReactMethod
    public void getBaseUrl(Promise promise)
    {
        APM apm = getAPM(promise);
        if(apm != null)
        {
            promise.resolve(apm.getBaseUrl());
        }
    }

    @ReactMethod
    public void setDebugMode(boolean debugMode)
    {
        APM apm = getAPM();
        if(apm != null)
        {
            apm.setDebugMode(debugMode);
        }
    }

    @ReactMethod
    public void isDebugMode(Promise promise)
    {
        APM apm = getAPM(promise);
        if(apm != null)
        {
            promise.resolve(apm.isDebugMode());
        }
    }

    @ReactMethod
    public void setGeolocEnabled(boolean geolocEnabled)
    {
        APM apm = getAPM();
        if(apm != null)
        {
            apm.setGeolocEnabled(geolocEnabled);
        }
    }

    @ReactMethod
    public void isGeolocEnabled(Promise promise)
    {
        APM apm = getAPM(promise);
        if(apm != null)
        {
            promise.resolve(apm.isGeolocEnabled());
        }
    }
}
