package com.thebluealliance.androidclient.datafeed.deserializers;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonNull;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.thebluealliance.androidclient.models.RankingItem;
import com.thebluealliance.api.model.ITeamRecord;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
public class RankingItemDeserializer implements JsonDeserializer<RankingItem>,
JsonSerializer<RankingItem> {
@Override
public RankingItem deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject data = json.getAsJsonObject();
RankingItem rankItem = new RankingItem();
rankItem.setDq(!isNull(data.get("dq")) ? data.get("dq").getAsInt() : 0);
rankItem.setMatchesPlayed(data.get("matches_played").getAsInt());
if (!isNull(data.get("rank"))) {
rankItem.setRank(data.get("rank").getAsInt());
} else {
rankItem.setRank(-1);
}
rankItem.setTeamKey(data.get("team_key").getAsString());
if (!isNull(data.get("qual_average"))) {
rankItem.setQualAverage(data.get("qual_average").getAsDouble());
}
if (!isNull(data.get("record"))) {
rankItem.setRecord(context.deserialize(data.get("record"), ITeamRecord.class));
}
List<Double> sortOrders = new ArrayList<>();
if (!isNull(data.get("sort_orders"))) {
JsonArray sortOrderJson = data.get("sort_orders").getAsJsonArray();
for (int i = 0; i < sortOrderJson.size(); i++) {
sortOrders.add(sortOrderJson.get(i).getAsDouble());
}
}
rankItem.setSortOrders(sortOrders);
List<Double> extraStats = new ArrayList<>();
if (!isNull(data.get("extra_stats"))) {
JsonArray extraStatsJson = data.get("extra_stats").getAsJsonArray();
for (int i = 0; i < extraStatsJson.size(); i++) {
extraStats.add(extraStatsJson.get(i).getAsDouble());
}
}
rankItem.setExtraStats(extraStats);
return rankItem;
}
@Override
public JsonElement serialize(RankingItem src, Type typeOfSrc, JsonSerializationContext context) {
JsonObject out = new JsonObject();
out.add("dq", new JsonPrimitive(src.getDq()));
out.add("matches_played", new JsonPrimitive(src.getMatchesPlayed()));
out.add("rank", new JsonPrimitive(src.getRank()));
out.add("team_key", new JsonPrimitive(src.getTeamKey()));
if (src.getQualAverage() != null) {
out.add("qual_average", new JsonPrimitive(src.getQualAverage()));
} else {
out.add("qual_average", JsonNull.INSTANCE);
}
if (src.getRecord() != null) {
JsonElement record = context.serialize(src.getRecord(), RankingItem.TeamRecord.class);
out.add("record", record);
} else {
out.add("record", JsonNull.INSTANCE);
}
JsonArray sortOrders = new JsonArray();
for (int i = 0; i < src.getSortOrders().size(); i++) {
sortOrders.add(src.getSortOrders().get(i));
}
out.add("sort_orders", sortOrders);
return out;
}
private static boolean isNull(JsonElement element) {
return element == null || element.isJsonNull();
}
public static class RecordDeserializer implements JsonDeserializer<RankingItem.TeamRecord>,
JsonSerializer<RankingItem.TeamRecord> {
@Override
public RankingItem.TeamRecord deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
JsonObject data = json.getAsJsonObject();
RankingItem.TeamRecord record = new RankingItem.TeamRecord();
record.setWins(data.get("wins").getAsInt());
record.setLosses(data.get("losses").getAsInt());
record.setTies(data.get("ties").getAsInt());
return record;
}
@Override
public JsonElement serialize(RankingItem.TeamRecord src, Type typeOfSrc, JsonSerializationContext context) {
JsonObject data = new JsonObject();
data.addProperty("wins", src.getWins());
data.addProperty("losses", src.getLosses());
data.addProperty("ties", src.getTies());
return data;
}
}
}