/*
 * (c) 2020 Pluto Inc.
 */
package tv.pluto.mongo.utils.json;

import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import org.bson.types.ObjectId;

public class ObjectIdsAdapter
    implements JsonDeserializer<List<ObjectId>>, JsonSerializer<List<ObjectId>> {
  @Override
  public JsonElement serialize(
      List<ObjectId> src, Type typeOfSrc, JsonSerializationContext context) {
    JsonArray jsonArray = new JsonArray();

    for (ObjectId id : src) {
      if (id == null) {
        jsonArray.add("");
      } else {
        jsonArray.add(id.toHexString());
      }
    }

    return jsonArray;
  }

  @Override
  public List<ObjectId> deserialize(
      JsonElement json, Type typeOfT, JsonDeserializationContext context)
      throws JsonParseException {
    JsonArray jsonArray = json.getAsJsonArray();

    List<ObjectId> ids = new ArrayList<>();

    jsonArray.forEach(
        id -> {
          if (!id.getAsString().equals("null")) {
            ids.add(new ObjectId(id.getAsString()));
          } else {
            ids.add(null);
          }
        });

    return ids;
  }
}
