package hirondelle.fish.main.rsvp;
import java.util.*;
import java.util.logging.Logger;
import hirondelle.web4j.database.DAOException;
import hirondelle.web4j.model.Id;
import hirondelle.web4j.model.ModelCtorException;
import hirondelle.web4j.util.Util;
import hirondelle.fish.main.member.Member;
import hirondelle.web4j.database.Db;
final class RsvpDAO {
List<Rsvp> list(Id aNextVisitId) throws DAOException {
List<Rsvp> result = getActiveMemberRsvps(aNextVisitId);
addRsvpResponses(aNextVisitId, result);
return Collections.unmodifiableList(result);
}
Rsvp fetchForChange(Id aVisitId, Id aMemberId) throws DAOException {
return Db.fetch(Rsvp.class, RsvpUpdate.RSVP_FETCH_FOR_CHANGE, aVisitId, aMemberId);
}
void update(Rsvp aRsvp) throws DAOException {
Object[] params = {aRsvp.getResponse(), aRsvp.getVisitId(), aRsvp.getMemberId()};
Db.edit(RsvpUpdate.RSVP_CHANGE, params);
}
void add(Rsvp aRsvp) throws DAOException {
Object[] params = {aRsvp.getVisitId(), aRsvp.getMemberId(), aRsvp.getResponse()};
Db.edit(RsvpAdd.RSVP_ADD, params);
}
Integer countNumYes(Id aVisitId) throws DAOException {
return Db.fetchValue(Integer.class, RsvpShow.RSVP_FETCH_NUM_YES, aVisitId);
}
private static final Logger fLogger = Util.getLogger(RsvpDAO.class);
private List<Rsvp> getActiveMemberRsvps(Id aNextVisitId) throws DAOException {
List<Rsvp> result = new ArrayList<Rsvp>();
List<Member> activeMembers = Db.list(Member.class, RsvpShow.RSVP_LIST_ACTIVE_MEMBERS);
for(Member member : activeMembers){
Rsvp rsvp = null;
try {
rsvp = new Rsvp(aNextVisitId, member.getId(), member.getName(), null);
}
catch (ModelCtorException ex){
fLogger.severe("Unexpected exception in RsvpDAO. Cannot construct Rsvp object.");
}
result.add(rsvp);
}
fLogger.fine("Active Members, no Rsvp responses : " + result);
return result;
}
private void addRsvpResponses(Id aNextVisitId, List<Rsvp> aActiveMembers) throws DAOException {
List<Rsvp> responses = Db.list(Rsvp.class, RsvpShow.RSVP_LIST_RESPONSES, aNextVisitId);
for(Rsvp activeMember: aActiveMembers){
for(Rsvp response: responses){
if ( activeMember.getMemberId().equals(response.getMemberId())){
activeMember.setResponse(response.getResponse());
}
}
}
fLogger.fine("Active Members, with Rsvp responses added: " + aActiveMembers);
}
}