package com.rnboat.framework;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableNativeArray;
import com.facebook.react.bridge.ReadableNativeMap;
import com.google.gson.Gson;
import com.rnboat.framework.diskcache.AsyncDiskCache;

import java.util.ArrayList;
import java.util.HashMap;

/**
 * Created by Castiel on 2018/3/30.
 */

public class GlobalConfigModule extends ReactContextBaseJavaModule {

    private static String MODULE_NAME = "GlobalConfig";

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

    @Override
    public String getName() {
        return MODULE_NAME;
    }

    @ReactMethod
    public void put(ReadableArray readableArray, Promise promise) {
        try {
            if (readableArray.size() < 2)
                promise.resolve(null);

            Object value = null;
            switch (readableArray.getType(1)) {
                case Map: {
                    ReadableNativeMap middleMap = (ReadableNativeMap) readableArray.getMap(1);
                    HashMap nativeMap = middleMap.toHashMap();
                    value = (new Gson()).toJson(nativeMap);
                    break;
                }
                case Array: {
                    ReadableNativeArray middleArray = (ReadableNativeArray) readableArray.getMap(1);
                    ArrayList nativeArray = middleArray.toArrayList();
                    value = (new Gson()).toJson(nativeArray);
                    break;
                }
                case Number: {
                    value = readableArray.getDouble(1);
                    break;
                }
                case String: {
                    value = readableArray.getString(1);
                    break;
                }
                case Boolean: {
                    value = readableArray.getBoolean(1);
                    break;
                }
                default: {
                }
            }

            Boolean rs = AsyncDiskCache.syncWriteCache(readableArray.getString(0), value);
            promise.resolve(rs);
        } catch (Exception e) {
            promise.reject(e);
        }
    }

    @ReactMethod
    public void get(ReadableArray readableArray, Promise promise) {
        try {
            if (readableArray.size() < 1)
                promise.resolve(null);
            Object value = AsyncDiskCache.syncReadCache(readableArray.getString(0), Object.class);
            promise.resolve(value);
        } catch (Exception e) {
            promise.reject(e);
        }
    }

    @ReactMethod
    public void remove(ReadableArray readableArray) {
        if (readableArray.size() < 1)
            return;
        AsyncDiskCache.removeCache(readableArray.getString(0));
    }

    @ReactMethod
    public void getAppScenes(Promise promise) {
        if (ConfigManager.APPCONFIG != null && ConfigManager.APPCONFIG.getScene() != null)
            promise.resolve((new Gson()).toJson(ConfigManager.APPCONFIG.getScene()));
    }
}
