package hirondelle.fish.main.visit;

import java.util.*;
import hirondelle.web4j.model.Id;
import hirondelle.web4j.database.DAOException;
import hirondelle.web4j.util.Util;
import hirondelle.web4j.database.Db;
import hirondelle.web4j.database.DynamicSql;

/**
 Data Access Object (DAO) for {@link Visit} objects.
*/
public final class VisitDAO {
  
  /**
   Return a <tt>List</tt> of all {@link Visit} objects.
   
   @param aOrderBy determies the order of the returned items.
  */
  List<Visit> list(DynamicSql aOrderBy) throws DAOException {
    return Db.search(Visit.class, VisitAction.VISIT_LIST, aOrderBy);
  }
  
  /**
   Return a single {@link Visit} identified by its id.
  */
  Visit fetch(Id aVisitId) throws DAOException {
    return Db.fetch(Visit.class, VisitAction.VISIT_FETCH, aVisitId);
  }
  
  /**
   Fetch the next future {@link Visit}.
   
   <P>This method is <tt>public</tt>, since used by other packages.
  */
  public Visit fetchNextFutureVisit() throws DAOException {
    return Db.fetch(Visit.class, VisitAction.VISIT_FETCH_NEXT_FUTURE);
  }
  
  /**
   Add a new {@link Visit} to the database.
   
   @return the autogenerated database id.
  */
  Id add(Visit aVisit) throws DAOException {
    return Db.add(VisitAction.VISIT_ADD, baseParamsFrom(aVisit));
  }
  
  /**
   Update an existing {@link Visit}. 
  */
  boolean change(Visit aVisit) throws DAOException {
    Object[] params = Db.addIdTo(baseParamsFrom(aVisit), aVisit.getId());
    return Util.isSuccess(Db.edit(VisitAction.VISIT_CHANGE, params));
  }

  /**
   Delete a {@link Visit}.
   
   <P>If an item is linked to this {@link Visit}, then deletion will fail, and a 
   {@link DAOException} is thrown.
  */
  void delete(Id aVisitId) throws DAOException {
    Db.delete(VisitAction.VISIT_DELETE, aVisitId);
  }

  //PRIVATE
  
  private Object[] baseParamsFrom(Visit aVisit){
    return new Object[]{aVisit.getRestaurant().getId(), aVisit.getLunchDate(), aVisit.getMessage()};
  }
}