package tv.pluto.mongo.utils.json;

import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;

public class MapDataDeserializer<T> implements JsonDeserializer<Map<String, T>> {

  @Override
  public Map<String, T> deserialize(
      JsonElement json, Type typeOfT, JsonDeserializationContext context)
      throws JsonParseException {
    JsonObject jsonObject = json.getAsJsonObject();
    JsonObject mapDataJson = jsonObject.getAsJsonObject("mapData");
    Map<String, T> mapData = new HashMap<>();

    for (Map.Entry<String, JsonElement> entry : mapDataJson.entrySet()) {
      String key = entry.getKey();
      T value =
          context.deserialize(
              entry.getValue(), ((ParameterizedType) typeOfT).getActualTypeArguments()[1]);
      mapData.put(key, value);
    }

    return mapData;
  }
}
