package com.moonmiles.bridge.apm.service.gift;

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.moonmiles.apmservices.model.APMBurn;
import com.moonmiles.apmservices.model.APMCategories;
import com.moonmiles.apmservices.model.APMGift;
import com.moonmiles.apmservices.model.APMGifts;
import com.moonmiles.apmservices.model.APMUser;
import com.moonmiles.apmservices.net.APMException;
import com.moonmiles.apmservices.sdk.gift.APMGiftCategoryListListener;
import com.moonmiles.apmservices.sdk.gift.APMGiftCheckAvailabilityListener;
import com.moonmiles.apmservices.sdk.gift.APMGiftListListener;
import com.moonmiles.apmservices.sdk.gift.APMGiftViewListener;
import com.moonmiles.apmservices.sdk.gift.APMServicesGift;
import com.moonmiles.bridge.apm.APMConstants;
import com.moonmiles.bridge.apm.abs.APMReactContextBaseJavaModule;
import com.moonmiles.bridge.apm.utils.APMBridgeUtils;

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

public class APMServicesGiftModule extends APMReactContextBaseJavaModule
{

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

    @ReactMethod
    public static void giftCheckAvailability(ReadableMap gift, final Promise promise)
    {
        try
        {
            APMGift apmGift = new APMGift();
            apmGift.initWithJSONObject(APMBridgeUtils.convertMapToJson(gift));
            APMServicesGift.giftCheckAvailability(apmGift, new APMGiftCheckAvailabilityListener()
            {
                @Override
                public void giftCheckAvailabilitySuccess(APMUser user, APMBurn burn)
                {
                    HashMap map = new HashMap();
                    map.put("user", user);
                    map.put("burn", burn);
                    APMBridgeUtils.resolvePromise(map, promise);
                }

                @Override
                public void failure(APMException e)
                {
                    APMBridgeUtils.rejectPromise(e, promise);
                }
            });
        }
        catch(Exception e)
        {
            e.printStackTrace();
            APMBridgeUtils.rejectPromise(e, promise);
        }
    }

    @ReactMethod
    public static void giftList(String categoryId, String amount, final Promise promise)
    {
        try
        {
            APMServicesGift.giftList(categoryId, amount, new APMGiftListListener()
            {
                @Override
                public void giftListSuccess(APMGifts gifts)
                {
                    APMBridgeUtils.resolvePromise(gifts, promise);
                }

                @Override
                public void failure(APMException e)
                {
                    APMBridgeUtils.rejectPromise(e, promise);
                }
            });
        }
        catch(Exception e)
        {
            e.printStackTrace();
            APMBridgeUtils.rejectPromise(e, promise);
        }
    }

    @ReactMethod
    public static void giftCategoryList(final Promise promise)
    {
        try
        {
            APMServicesGift.giftCategoryList(new APMGiftCategoryListListener()
            {
                @Override
                public void giftCategoryListSuccess(APMCategories categories)
                {
                    APMBridgeUtils.resolvePromise(categories, promise);
                }

                @Override
                public void failure(APMException e)
                {
                    APMBridgeUtils.rejectPromise(e, promise);
                }
            });
        }
        catch(Exception e)
        {
            e.printStackTrace();
            APMBridgeUtils.rejectPromise(e, promise);
        }
    }

    @ReactMethod
    public static void giftView(String giftId, final Promise promise)
    {
        try
        {
            APMServicesGift.giftView(giftId, new APMGiftViewListener()
            {
                @Override
                public void giftViewSuccess(APMGift gift)
                {
                    APMBridgeUtils.resolvePromise(gift, promise);
                }

                @Override
                public void failure(APMException e)
                {
                    APMBridgeUtils.rejectPromise(e, promise);
                }
            });
        }
        catch(Exception e)
        {
            e.printStackTrace();
            APMBridgeUtils.rejectPromise(e, promise);
        }
    }

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

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