package ca.uwaterloo.uwfoodservicesutility;
import java.util.ArrayList;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import ca.uwaterloo.uwfoodservices.InitialiseSingleton;
import android.app.Activity;
public class ParseMenuData {
private static final String TAG_META = "meta";
private static final String TAG_DATA = "data";
private static final String TAG_OUTLETS = "outlets";
//private static final String TAG_BONAPPETIT = "BonAppetit";
private static final String TAG_MENU = "menu";
private static final String TAG_OUTLET_ID = "outlet_id";
private static final String TAG_OUTLET_NAME = "outlet_name";
private static final String TAG_DAY = "day";
private static final String TAG_MEALS = "meals";
private static final String TAG_LUNCH = "lunch";
private static final String TAG_DINNER = "dinner";
private static final String TAG_PRODUCT_NAME = "product_name";
private static final String TAG_PRODUCT_ID = "product_id";
private static final String TAG_DIET_TYPE = "diet_type";
private ArrayList<RestaurantMenuObject> restaurantMenu;
protected InitialiseSingleton init;
public ParseMenuData(Activity activity){
init = (InitialiseSingleton)activity.getApplication();
}
public String capitalize(String product_name) {
String[] tokens = product_name.split("\\s");
product_name = "";
for(int i = 0; i < tokens.length; i++){
if (!(tokens[i].equals("w/") || tokens[i].equals("and") || tokens[i].equals("on")
|| tokens[i].equals("with") || tokens[i].equals("de") || tokens[i].equals("a"))
|| tokens[i].equals("served") || tokens[i].equals("in") || tokens[i].equals("of")) {
char capLetter = Character.toUpperCase(tokens[i].charAt(0));
product_name += " " + capLetter + tokens[i].substring(1, tokens[i].length());
} else {
product_name += " " + tokens[i];
}
}
return product_name;
}
public String checkProductName(String product_name, String outlet_name) {
product_name = product_name.trim();
if (outlet_name.equals("Bon Appetit")) {
if (product_name.matches("^BA\\..*")) {
product_name = product_name.replace("BA.", "");
} else if (product_name.matches("^BA,.*")) {
product_name = product_name.replace("BA,", "");
} else if (product_name.matches("^BA.*")) {
product_name = product_name.replace("BA", "");
}
}
product_name = product_name.trim();
if (product_name.matches(".*,V$")) {
product_name = product_name.replace(",V", "");
} else if(product_name.matches(".* V$")) {
product_name = product_name.replace(" V", "");
}
product_name = product_name.trim();
if (product_name.contains(" and ")) {
product_name = product_name.replace(" and ", " & ");
}
product_name = product_name.trim();
if (product_name.contains("w/")) {
if(product_name.charAt(product_name.indexOf("w/") + 2) != ' ') {
product_name = product_name.substring(0, product_name.indexOf("w/") + 2) + " " + product_name.substring(product_name.indexOf("w/") + 2);
}
}
product_name = product_name.trim();
if (product_name.endsWith(",") || product_name.endsWith(".")) {
product_name = product_name.substring(0, product_name.length() - 1);
}
product_name = capitalize(product_name);
product_name = product_name.trim();
return product_name;
}
public void Parse(JSONObject json){
restaurantMenu = new ArrayList<RestaurantMenuObject>();
try {
JSONObject meta = json.getJSONObject(TAG_META);
if (meta.getString("status").equals("200")){
JSONObject data = json.getJSONObject(TAG_DATA);
JSONArray outlets = data.getJSONArray(TAG_OUTLETS);
JSONObject restaurant;
JSONArray menu;
JSONObject day;
JSONObject meals;
JSONArray lunch;
JSONArray dinner;
String product_name;
Integer product_id = null;
String diet_type;
String weekDay;
Integer outlet_id;
String outlet_name;
String location_name;
Integer image;
ArrayList<RestaurantMenuItem> lunchList = new ArrayList<RestaurantMenuItem>();
ArrayList<RestaurantMenuItem> dinnerList = new ArrayList<RestaurantMenuItem>();
int position = 0;
DailyMenu[] menuArray = new DailyMenu[7];
for(int i = 0; i < outlets.length(); i++){
menuArray = new DailyMenu[7];
for (int j = 0; j < 7; j++) {
menuArray[j] = new DailyMenu(null, null);
}
lunchList = new ArrayList<RestaurantMenuItem>();
dinnerList = new ArrayList<RestaurantMenuItem>();
restaurant = outlets.getJSONObject(i);
outlet_id = Integer.parseInt(restaurant.getString(TAG_OUTLET_ID));
outlet_name = MenuUtilities.checkName(restaurant.getString(TAG_OUTLET_NAME));
location_name = "";
image = MenuUtilities.setImageHash().get(outlet_name);
menu = restaurant.getJSONArray(TAG_MENU);
for (int j = 0; j < menu.length(); j++) {
lunchList = new ArrayList<RestaurantMenuItem>();
dinnerList = new ArrayList<RestaurantMenuItem>();
day = menu.getJSONObject(j);
meals = day.getJSONObject(TAG_MEALS);
weekDay = day.getString(TAG_DAY);
if (weekDay.equals("Monday")) { position = 0; }
else if (weekDay.equals("Tuesday")) { position = 1; }
else if (weekDay.equals("Wednesday")) { position = 2; }
else if (weekDay.equals("Thursday")) { position = 3; }
else if (weekDay.equals("Friday")) { position = 4; }
else if (weekDay.equals("Saturday")) { position = 5; }
else if (weekDay.equals("Sunday")) { position = 6; }
// Lunch
if (meals.has(TAG_LUNCH) && (meals.getJSONArray(TAG_LUNCH).length() > 0)) {
lunch = meals.getJSONArray(TAG_LUNCH);
for (int k = 0; k < lunch.length(); k ++) {
product_name = lunch.getJSONObject(k).getString(TAG_PRODUCT_NAME);
product_id = MenuUtilities.getInteger(lunch.getJSONObject(k).getString(TAG_PRODUCT_ID));
diet_type = lunch.getJSONObject(k).getString(TAG_DIET_TYPE);
// Check for 'Chef Special' which has a product id but does not contain any product info
if (product_id != null) {
if (product_id == 2439) {
product_id = null;
}
}
lunchList.add(new RestaurantMenuItem(product_name, product_id, diet_type));
}
}
// Dinner
if (meals.has(TAG_DINNER) && (meals.getJSONArray(TAG_DINNER).length() > 0)) {
dinner = meals.getJSONArray(TAG_DINNER);
for (int k = 0; k < dinner.length(); k ++) {
product_name = dinner.getJSONObject(k).getString(TAG_PRODUCT_NAME);
product_id = MenuUtilities.getInteger(dinner.getJSONObject(k).getString(TAG_PRODUCT_ID));
diet_type = dinner.getJSONObject(k).getString(TAG_DIET_TYPE);
// Check for 'Chef Special' which has a product id but does not contain any product info
if (product_id != null) {
if (product_id == 2439) {
product_id = null;
}
}
dinnerList.add(new RestaurantMenuItem(product_name, product_id, diet_type));
}
}
if (lunchList.size() == 0) { lunchList = null; }
if (dinnerList.size() == 0) { dinnerList = null; }
menuArray[position] = new DailyMenu(lunchList, dinnerList); // THIS ONE
}
if (lunchList.size() == 0) { lunchList = null; }
if (dinnerList.size() == 0) { dinnerList = null; }
menuArray[position] = new DailyMenu(lunchList, dinnerList);
restaurantMenu.add(new RestaurantMenuObject(outlet_id, outlet_name, location_name, image, menuArray));
}
//holder = RestaurantMenuHolder.getInstance(restaurantMenu);
init.initMenus(restaurantMenu);
}
init.initMenus(restaurantMenu);
//holder = RestaurantMenuHolder.getInstance(restaurantMenu);
} catch (JSONException e) {
e.printStackTrace();
}
}
}