package com.helpshift.react;

import com.facebook.react.bridge.WritableArray;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.WritableMap;

import java.util.List;
import java.util.Map;

public class HelpshiftUtils {

  // Helper function to convert Map<String, Object> to WritableMap
  public static WritableMap convertMapToWritableMap(Map<String, Object> map) {
    WritableMap writableMap = Arguments.createMap();

    if (map == null) {
      return writableMap;
    }

    for (Map.Entry<String, Object> entry : map.entrySet()) {
      Object value = entry.getValue();
      String key = entry.getKey();

      if (value instanceof String) {
        writableMap.putString(key, (String) value);
      } else if (value instanceof Integer) {
        writableMap.putInt(key, (Integer) value);
      } else if (value instanceof Double) {
        writableMap.putDouble(key, (Double) value);
      } else if (value instanceof Boolean) {
        writableMap.putBoolean(key, (Boolean) value);
      } else if (value instanceof Map) {
        writableMap.putMap(key, convertMapToWritableMap((Map<String, Object>) value)); // Recursive for nested maps
      } else if (value instanceof List) {
        writableMap.putArray(key, convertListToWritableArray((List<Object>) value)); // Handle arrays/lists
      } else {
        writableMap.putString(key, value == null ? "" : value.toString()); // Fallback for unknown types
      }
    }

    return writableMap;
  }

  public static WritableArray convertListToWritableArray(List<Object> list) {
    WritableArray writableArray = Arguments.createArray();

    if (list == null) {
      return writableArray;
    }

    for (Object item : list) {
      if (item instanceof String) {
        writableArray.pushString((String) item);
      } else if (item instanceof Integer) {
        writableArray.pushInt((Integer) item);
      } else if (item instanceof Double) {
        writableArray.pushDouble((Double) item);
      } else if (item instanceof Boolean) {
        writableArray.pushBoolean((Boolean) item);
      } else if (item instanceof Map) {
        writableArray.pushMap(convertMapToWritableMap((Map<String, Object>) item)); // Nested maps inside arrays
      } else if (item instanceof List) {
        writableArray.pushArray(convertListToWritableArray((List<Object>) item)); // Nested arrays
      } else {
        writableArray.pushString(item == null ? "" : item.toString()); // Fallback for unknown types
      }
    }

    return writableArray;
  }
}
