package org.onebrick.android.models;
import android.database.Cursor;
import android.provider.BaseColumns;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.activeandroid.Model;
import com.activeandroid.annotation.Column;
import com.activeandroid.annotation.Table;
import com.activeandroid.query.Select;
import com.google.gson.JsonArray;
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 org.onebrick.android.helpers.Utils;
import java.lang.reflect.Type;
@Table(name = "event", id = BaseColumns._ID)
public class Event extends Model {
public static final String EVENT_ID = "event_id";
public static final String USER_RSVP = "user_rsvp";
public static final String CHAPTER_ID = "chapter_id";
public static final String PAST_EVENT = "past_event";
public static final String EVENT_TITLE = "title";
public static final String EVENT_SUMMARY = "summary";
public static final String START_DATE = "start_date";
public static final String EVENT_STATUS = "event_status";
@Column(name = EVENT_ID, unique = true, onUniqueConflict = Column.ConflictAction.REPLACE)
private long eventId;
@Column(name = EVENT_TITLE, index = true)
private String title;
@Column(name = START_DATE)
private String startDate;
@Column(name = "end_date")
private String endDate;
@Column(name = "address")
private String address;
@Column(name = "esn_title")
private String esnTitle;
@Column(name = EVENT_SUMMARY)
private String summary;
@Column(name = "rsvp_capacity")
private int rsvpCapacity;
@Column(name = "rsvp_date")
private String rsvpOpenDate;
@Column(name = "rsvp_count")
private int rsvpCount;
@Column(name = USER_RSVP)
private int userRSVP;
@Column(name = "coordinator_email")
private String coordinatorEmail;
@Column(name = "manager_email")
private String managerEmail;
@Column(name = CHAPTER_ID)
private int chapterId;
@Column(name = "past_event")
private boolean pastEvent ;
@Column(name = "photo")
private String photo;
@Column(name = EVENT_STATUS)
private String eventStatus;
@Override
public String toString() {
return title;
}
public long getEventId() {
return eventId;
}
public String getTitle() {
return title;
}
public String getStartDate() {
return startDate;
}
public String getEndDate() {
return endDate;
}
public String getAddress() {
return address;
}
public String getEsnTitle() {
return esnTitle;
}
public String getSummary() {
return summary;
}
public int getRsvpCapacity() {
return rsvpCapacity;
}
public int getUserRSVP() {
return userRSVP;
}
public int getRsvpCount() {
return rsvpCount;
}
public String getRSVPOpenDate() {
return rsvpOpenDate;
}
public boolean isRsvp() {
return userRSVP == 1;
}
public String getCoordinatorEmail() {
return coordinatorEmail;
}
public void setCoordinatorEmail(String coordinatorEmail) {
this.coordinatorEmail = coordinatorEmail;
}
public String getManagerEmail() {
return managerEmail;
}
public void setManagerEmail(String managerEmail) {
this.managerEmail = managerEmail;
}
public String getProfilePhotoUri() {
return getProfilePhotoUri(eventId);
}
public void rsvp() {
userRSVP = 1;
}
public void unRsvp() {
userRSVP = 0;
}
public int getChapterId() {
return chapterId;
}
public void setChapterId(int chapterId) {
this.chapterId = chapterId;
}
@NonNull
public String[] getPhotos() {
return Utils.getPhotos(photo);
}
public void setPastEvent(boolean pastEvent) {
this.pastEvent = pastEvent;
}
// TODO: this is hack need to get image uri from server
private static String getProfilePhotoUri(long eventId) {
long imageId = (eventId % 20) + 1;
return "assets://images/image" + imageId + ".jpg";
}
/**
* Get event status: either open or cancelled
* @return
*/
public String getEventStatus() {
return eventStatus;
}
public static Event fromCursor(@NonNull Cursor cursor) {
final Event event = new Event();
event.loadFromCursor(cursor);
return event;
}
public static class EventJsonDeserializer implements JsonDeserializer<Event> {
@Override
public Event deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
final JsonObject jsonObject = json.getAsJsonObject();
final Event event = new Event();
event.title = jsonObject.get("title").getAsString();
event.eventId = jsonObject.get("nid").getAsLong();
event.esnTitle = jsonObject.get("esn_title").getAsString();
event.startDate = jsonObject.get("field_event_date_value").getAsString();
event.endDate = jsonObject.get("field_event_date_value2").getAsString();
event.rsvpCapacity = jsonObject.get("field_event_max_rsvp_capacity_value").getAsInt();
event.rsvpOpenDate = jsonObject.get("field_rsvp_date_value").getAsString();
// event status either open or cancelled
event.eventStatus = jsonObject.get("field_event_status_value").getAsString();
event.address = jsonObject.get("address").getAsString();
if (jsonObject.has("photos")) {
JsonArray photos=jsonObject.get("photos").getAsJsonArray();
if (photos.size() > 0) {
event.photo = decodeElements(photos);
}
}
if (jsonObject.has("manager_email")) {
final JsonElement jsonElement = jsonObject.get("manager_email");
if (!jsonElement.isJsonNull()) {
event.managerEmail = jsonElement.getAsString();
}
}
// should check json return. sometimes, there are multiple coordinators
if (jsonObject.has("coordinator_email")) {
final JsonElement jsonElement = jsonObject.get("coordinator_email");
if (!jsonElement.isJsonNull()) {
event.coordinatorEmail = jsonElement.getAsString();
}
}
if (jsonObject.has("body_value")) {
final JsonElement jsonElement = jsonObject.get("body_value");
if (!jsonElement.isJsonNull()) {
event.summary = jsonElement.getAsString();
}
}
if (jsonObject.has("rsvpCnt")) {
event.rsvpCount = jsonObject.get("rsvpCnt").getAsInt();
}
if (jsonObject.has("usrRSVP")) {
event.userRSVP = jsonObject.get("usrRSVP").getAsInt();
}
return event;
}
private String decodeElements(JsonArray items) {
StringBuilder builder = new StringBuilder();
for (JsonElement item : items){
if (!item.isJsonNull()) {
builder.append(item.getAsString());
builder.append(Utils.PHOTO_SEPARATOR);
}
}
return builder.toString();
}
}
@Nullable
public static Event findById(long eventId) {
return new Select().from(Event.class).where(EVENT_ID + "=?",
eventId).executeSingle();
}
public void setSummary(String summary) {
this.summary = summary;
}
}