package de.flower.rmt.model.db.entity;
import de.flower.common.model.db.entity.AbstractBaseEntity;
import de.flower.rmt.model.db.entity.event.Event;
import de.flower.rmt.model.db.type.RSVPStatus;
import org.hibernate.annotations.Index;
import javax.mail.internet.InternetAddress;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @author flowerrrr
*/
@SuppressWarnings("FieldCanBeLocal")
@Entity
@Table(name = "invitation")
public class Invitation extends AbstractBaseEntity {
@Enumerated(EnumType.STRING)
@NotNull(message = "{validation.rsvpstatus.notnull}")
@Index(name = "ix_status")
private RSVPStatus status = RSVPStatus.NORESPONSE;
/**
* Date of response. Might be updated when user changes his status.
*/
@Column
@Index(name = "ix_date")
private Date date;
@OneToMany(mappedBy = "invitation", cascade = CascadeType.REMOVE)
@OrderBy("createDate")
private List<Comment> comments = new ArrayList<>();
/**
* First comment of context user.
* Used for ui forms. Initialized when invitation is loaded.
*/
@Transient
@Size(max = Comment.MAXLENGTH)
private String comment;
@Column
@Size(max = 50)
private String guestName;
@NotNull
@Column
@Index(name = "ix_invitationsent")
private Boolean invitationSent = false;
@Column
@Index(name = "ix_invitationsentdate")
private Date invitationSentDate;
@Column
@Index(name = "ix_noresponseremindersent")
private Boolean noResponseReminderSent = false;
@Column
@Index(name = "ix_noresponseremindersentdate")
private Date noResponseReminderSentDate;
@Column
@Index(name = "ix_unsureremindersent")
private Boolean unsureReminderSent = false;
@Column
@Index(name = "ix_unsureremindersentdate")
private Date unsureReminderSentDate;
@NotNull
@ManyToOne(fetch = FetchType.LAZY)
@Index(name = "ix_event")
private Event event;
@ManyToOne(fetch = FetchType.LAZY)
@Index(name = "ix_user")
private User user;
protected Invitation() {
}
public Invitation(Event event, User user) {
this.user = user;
this.event = event;
}
public Invitation(final Event event, final String guestName) {
this.event = event;
this.guestName = guestName;
}
public RSVPStatus getStatus() {
return status;
}
public void setStatus(RSVPStatus status) {
this.status = status;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public List<Comment> getComments() {
return comments;
}
public String getComment() {
return comment;
}
public void setComment(final String comment) {
this.comment = comment;
}
public String getGuestName() {
return guestName;
}
public void setGuestName(String guestName) {
this.guestName = guestName;
}
public Event getEvent() {
return event;
}
public void setEvent(Event event) {
this.event = event;
}
public User getUser() {
return user;
}
public void setUser(final User user) {
this.user = user;
}
public Boolean isInvitationSent() {
return invitationSent;
}
public void setInvitationSent(final Boolean invitationSent) {
this.invitationSent = invitationSent;
}
public Date getInvitationSentDate() {
return invitationSentDate;
}
public Boolean isUnsureReminderSent() {
return unsureReminderSent;
}
public Boolean isNoResponseReminderSent() {
return noResponseReminderSent;
}
public String getName() {
if (user == null) {
// TODO (flowerrrr - 04.04.12) marking the name should be done in ui!
return guestName + " (G)";
} else {
return user.getFullname();
}
}
public String getEmail() {
if (user == null) {
throw new IllegalStateException("Call #isEmail before accessing email-field.");
} else {
return user.getEmail();
}
}
public String[] getEmails() {
if (user == null) {
throw new IllegalStateException("Call #isEmail before accessing email-field.");
} else {
return user.getEmails();
}
}
public boolean hasEmail() {
return user != null;
}
public InternetAddress getInternetAddress() {
if (user == null) {
throw new IllegalStateException("Call #isEmail before accessing email-field.");
} else {
return user.getInternetAddress();
}
}
public InternetAddress[] getInternetAddresses() {
if (user == null) {
throw new IllegalStateException("User required to lookup internet addresses.");
}
return user.getInternetAddresses();
}
@Override
public String toString() {
return "Invitation{" +
"id=" + getId() +
", status=" + status +
", date=" + date +
"}";
}
}