package com.customfit.ctg.model;
import java.util.*;
/**
* This describes a User of the system, including the user's name,
* managed Members, and nutrition plans.
*
* @author David
*/
public class User
{
/**
* The user's name.
*/
private String name;
/**
* The user's members.
*/
private List<Member> members;
/**
* The list of meals for the user.
*/
private List<Meal> meals = new ArrayList<Meal>();
/**
* Constructs a user with the name provided.
*
* @param name The user's name.
*/
public User(String name)
{
this.name = name;
this.members = new ArrayList<Member>();
this.members.add(new Member(name));
}
/**
* Constructs a user with the information provided.
*
* @param name The user's name.
* @param members All the user's members.
* @param meals The list of meals for the user.
*/
public User(String name, List<Member> members, List<Meal> meals)
{
this.name = name;
this.members = members;
this.meals = meals;
}
/**
* Gets the user's name.
*
* @return The user's name.
*/
public String getName()
{
return name;
}
/**
* Sets the user's name.
*
* @param name The user's name.
*/
public void setName(String name)
{
//set the name of one's own member
this.getOwnMember().setName(name);
//set one's own name
this.name = name;
}
/* MEMBER METHODS */
/**
* Gets all of the the user's members.
*
* @return The user's members.
*/
public List<Member> getAllMembers()
{
return members;
}
/**
* Gets the member by name.
*
* @return The member with that name, or null if nonexistent.
*/
public Member getMemberByName(String memberName)
{
for (Member member : this.getAllMembers())
{
if (member.getName().equals(memberName))
return member;
}
return null;
}
/**
* Get own user's member data, which is the member
* that has the same name as the user.
*
* @return The member with the name of the user name.
*/
public Member getOwnMember()
{
return this.getMemberByName(this.name);
}
/**
* Set own user's member data, which is the member
* that has the same name as the user.
*
* @param goal The nutritional goal set for the Member.
* @param goalDirection The direction of the nutritional goal.
*/
public void setOwnMember(Measurement goal, GoalDirection goalDirection)
{
for (Member member : this.getAllMembers())
{
if (member.getName().equals(member.getName()))
{
member.setGoal(goal);
member.setGoalDirection(goalDirection);
}
}
}
/**
* Set own user's member data, which is the member
* that has the same name as the user.
*
* @param member The member to copy data to user's own member.
*/
public void setOwnMember(Member member)
{
setOwnMember(member.getGoal(), member.getGoalDirection());
}
/**
* Gets all members except the user's own member data, which is the
* member that has the same name as the user.
*
* @return A list of Members.
*/
public List<Member> getAllOtherMembers()
{
List<Member> members = new ArrayList<Member>();
for (Member member : this.getAllMembers())
{
if (!member.getName().equals(this.getName()))
{
members.add(member);
}
}
return members;
}
/* MEAL METHODS */
/**
* Gets the list of meals for the user.
*
* @return The list of meals for the user.
*/
public List<Meal> getAllMeals()
{
return meals;
}
/**
* Gets a List of Meals for the date period specified.
*
* @param startDate The date (time is ignored in liue of 00:00:00.000).
* @param endDate Ending date (time is ignored in lieu of 23:59:59.999)
*
* @return List of Meals.
*/
public List<Meal> getMealsByDateRange(Date startDate, Date endDate)
{
Calendar calendarStart = Calendar.getInstance();
calendarStart.setTime(startDate);
calendarStart.set(Calendar.HOUR, 0);
calendarStart.set(Calendar.MINUTE, 0);
calendarStart.set(Calendar.SECOND, 0);
calendarStart.set(Calendar.MILLISECOND, 0);
startDate = calendarStart.getTime();
Calendar calendarEnd = Calendar.getInstance();
calendarEnd.setTime(endDate);
calendarEnd.set(Calendar.HOUR, 23);
calendarEnd.set(Calendar.MINUTE, 59);
calendarEnd.set(Calendar.SECOND, 59);
calendarEnd.set(Calendar.MILLISECOND, 999);
endDate = calendarEnd.getTime();
ArrayList<Meal> meals = new ArrayList<Meal>();
List<Meal> allMeals = this.getAllMeals();
if (!allMeals.isEmpty()) for (Meal meal : allMeals)
{
if (meal.getDate().after(startDate) && meal.getDate().before(endDate))
meals.add(meal);
else if (meal.getDate().equals(startDate) || meal.getDate().equals(endDate))
meals.add(meal);
}
return meals;
}
/**
* Gets a List of Meals for the date specified.
*
* @param date The date (time is ignored in lieu of 00:00:00.000).
*
* @return List of Meals.
*/
public List<Meal> getMealsByDate(Date date)
{
Calendar calendarStart = Calendar.getInstance();
calendarStart.setTime(date);
calendarStart.set(Calendar.HOUR, 0);
calendarStart.set(Calendar.MINUTE, 0);
calendarStart.set(Calendar.SECOND, 0);
calendarStart.set(Calendar.MILLISECOND, 0);
Date startDate = calendarStart.getTime();
Calendar calendarEnd = Calendar.getInstance();
calendarEnd.setTime(date);
calendarEnd.set(Calendar.HOUR, 23);
calendarEnd.set(Calendar.MINUTE, 59);
calendarEnd.set(Calendar.SECOND, 59);
calendarEnd.set(Calendar.MILLISECOND, 999);
Date endDate = calendarEnd.getTime();
return this.getMealsByDateRange(startDate, endDate);
}
/**
* Gets a list of meals starting on the date specified and
* all the way up to 7 days later.
*
* It starts at the first moment of the start date and ends at last
* moment of the end date.
*
* @param startDate The date (time is ignored in liue of 00:00:00.000).
*
* @return List of Meals.
*/
public List<Meal> getMealsForWeekStartingOn(Date startDate)
{
Calendar calendarStart = Calendar.getInstance();
calendarStart.setTime(startDate);
calendarStart.set(Calendar.HOUR, 0);
calendarStart.set(Calendar.MINUTE, 0);
calendarStart.set(Calendar.SECOND, 0);
calendarStart.set(Calendar.MILLISECOND, 0);
startDate = calendarStart.getTime();
Calendar calendarEnd = Calendar.getInstance();
calendarEnd.setTime(startDate);
calendarEnd.add(Calendar.DATE, 7);
calendarEnd.set(Calendar.HOUR, 23);
calendarEnd.set(Calendar.MINUTE, 59);
calendarEnd.set(Calendar.SECOND, 59);
calendarEnd.set(Calendar.MILLISECOND, 999);
Date endDate = calendarEnd.getTime();
return this.getMealsByDateRange(startDate, endDate);
}
/* AGGREGATE METHODS */
/**
* Gets a List of Meals for a Member.
*
* @param meals Meals to choose from.
* @param member Member.
*
* @return List of Meals.
*/
public static List<Meal> getMealsWithMember(List<Meal> meals, String memberName)
{
List<Meal> newMeals = new ArrayList<Meal>();
for (Meal meal : meals)
for (Member aMember : meal.getMembers())
if (aMember.getName().equals(memberName))
{
newMeals.add(meal);
break; //break from outer for loop
}
return newMeals;
}
/**
* Gets a List of Meals for a Member.
*
* @param member Member.
*
* @return List of Meals.
*/
public List<Meal> getMemberMeals(String memberName)
{
return User.getMealsWithMember(this.meals, memberName);
}
/**
* Gets a List of Meals for a Member.
*
* @param member Member.
*
* @return List of Meals.
*/
public List<Meal> getMemberMeals(Member member)
{
return this.getMemberMeals(member.getName());
}
/**
* Get the total goals store for all members.
*
* @return
*/
public void scaleAllMeals() {
Measurement goal = null;
//difference = target_goal - menu_total
//AmountToRemove = difference/RecipeCount
for (Meal m : getAllMeals()) {
}
}
/**
* Get the total goals store for all members.
*
* @return
*/
public Measurement getTotalGoal() {
Measurement goal = new Measurement(0.0, getOwnMember().getGoal().getUnit());
for (Member m : getAllMembers()) {
goal = goal.add(m.getGoal());
}
return goal;
}
/**
* Gets the nutrient being tracked by the member matching the user name.
*
* @return The nutrient to track.
*/
public String getTrackedNutrient()
{
return this.getOwnMember().getTrackedNutrient();
}
/**
* Helper function to take one of the aggregated meals
* and add a recipe back to it's original structure in the
* user.
*
* @param meal Meal to alter.
*
* @param recipe Recipe to add.
*/
public void addRecipeToMeal(Meal meal, Recipe recipe)
{
for (Meal internalMeal : this.meals)
{
if (internalMeal.equals(meal))
{
internalMeal.getRecipes().add(recipe);
break;
}
}
}
@Override
public boolean equals(Object object)
{
User user = (User)object;
if (this.name.equals(user.name)
&& this.meals.size() == user.meals.size()
&& this.members.size() == user.members.size())
{
for (int meal = 0; meal < this.meals.size(); meal++)
{
if (!this.meals.get(meal).equals(user.meals.get(meal)))
return false;
}
for (int member = 0; member < this.members.size(); member++)
{
if (!this.members.get(member).equals(user.members.get(member)))
return false;
}
return true;
}
return false;
}
}