package fr.paug.androidmakers.model;
import android.util.SparseArray;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import static fr.paug.androidmakers.util.MapUtil.*;
/**
* Created by stan on 18/03/2017.
*/
public class FirebaseDataConverted {
private static final SimpleDateFormat ISO_8601_DATEFORMAT =
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.ENGLISH);
private final Set<String> mAllLanguages = new HashSet<>();
private final SparseArray<Room> mRooms = new SparseArray<>();
private final SparseArray<Session> mSessions = new SparseArray<>();
private final SparseArray<Speaker> mSpeakers = new SparseArray<>();
private final List<ScheduleSlot> mScheduleSlots = new ArrayList<>();
private final Map<PartnerGroup.PartnerType, PartnerGroup> mPartners = new HashMap<>();
public SparseArray<Room> getRooms() {
return mRooms;
}
public SparseArray<Session> getSessions() {
return mSessions;
}
public SparseArray<Speaker> getSpeakers() {
return mSpeakers;
}
public List<ScheduleSlot> getScheduleSlots() {
return mScheduleSlots;
}
public Map<PartnerGroup.PartnerType, PartnerGroup> getPartners() {
return mPartners;
}
public Set<String> getAllLanguages() {
return mAllLanguages;
}
public void loadAllFromFirebase(Object value) {
mScheduleSlots.clear();
if (!(value instanceof Map)) {
return;
}
Map root = (Map) value;
loadRoomsFromFirebase(root.get("rooms"));
loadSpeakersFromFirebase(root.get("speakers"));
loadSessionsFromFirebase(root.get("sessions"));
loadScheduleFromFirebase(root.get("schedule"));
loadPartnersFromFirebase(root.get("partners"));
}
private void loadRoomsFromFirebase(Object object) {
if (!(object instanceof List)) {
return;
}
List values = (List) object;
for (Object value : values) {
if (value instanceof Map) {
Map map = (Map) value;
int id = getId(map);
if (id >= 0) {
mRooms.put(id, new Room(getString(map, "name")));
}
}
}
}
private void loadSpeakersFromFirebase(Object object) {
if (!(object instanceof List)) {
return;
}
List values = (List) object;
for (Object value : values) {
if (value instanceof Map) {
Map map = (Map) value;
int id = getId(map);
if (id >= 0) {
mSpeakers.put(id, new Speaker(
getString(map, "name"),
getString(map, "bio"),
getString(map, "company"),
getString(map, "surname"),
getString(map, "thumbnailUrl"),
getString(map, "rockstar"),
getSocialItems(map, "social")
));
}
}
}
}
private void loadSessionsFromFirebase(Object object) {
if (!(object instanceof List)) {
return;
}
List values = (List) object;
for (Object value : values) {
if (value instanceof Map) {
Map map = (Map) value;
int id = getId(map);
if (id >= 0) {
String language = getString(map, "language");
if (language != null) {
mAllLanguages.add(language);
}
mSessions.put(id, new Session(
getString(map, "title"),
getString(map, "description"),
language,
getIntArray(map, "speakers"),
getString(map, "subtype")
));
}
}
}
}
private void loadScheduleFromFirebase(Object object) {
if (!(object instanceof List)) {
return;
}
List values = (List) object;
for (Object value : values) {
if (value instanceof Map) {
Map map = (Map) value;
int roomId = getInt(map, "roomId", -1);
int sessionId = getInt(map, "sessionId", -1);
long startDate = getTimestamp(getString(map, "startDate"));
long endDate = getTimestamp(getString(map, "endDate"));
if (startDate > 0 && endDate > 0
&& sessionId >= 0 && roomId >= 0) {
ScheduleSlot schedule = new ScheduleSlot(
roomId, sessionId, startDate, endDate);
mScheduleSlots.add(schedule);
}
}
}
}
private void loadPartnersFromFirebase(Object object) {
if (!(object instanceof List)) {
return;
}
List values = (List) object;
for (Object value : values) {
if (value instanceof Map) {
Map map = (Map) value;
final PartnerGroup.PartnerType partnerGroup = PartnerGroup.getPartnerTypeFromString(getString(map, "group"));
final List<Partners> partnersList = getPartnerList(map, "elements");
if (partnerGroup != PartnerGroup.PartnerType.Unknown && partnersList != null && partnersList.size() > 0) {
mPartners.put(partnerGroup, new PartnerGroup(partnerGroup, partnersList));
}
}
}
}
private int getId(Map map) {
return getInt(map, "id", -1);
}
private long getTimestamp(String dateIso) {
if (dateIso == null) {
return 0;
}
if (dateIso.endsWith("Z")) {
dateIso = dateIso.substring(0, dateIso.length() - 1) + "+0000";
}
try {
return ISO_8601_DATEFORMAT.parse(dateIso).getTime();
} catch (ParseException e) {
return 0;
}
}
}