// Path: app/src/main/java/dev/wisebite/wisebite/domain/Dish.java
// @Getter
// @Setter
// @AllArgsConstructor(suppressConstructorProperties = true)
// @NoArgsConstructor
// @ToString
// @Builder
// public class Dish implements Entity {
// 
//     private String id;
//     private String name;
//     private Double price;
//     private String description;
// 
//     private Map<String, Object> reviews = new LinkedHashMap<>();
// 
// 
//     @Override
//     public String getId() {
//         return id;
//     }
// 
//     @Override
//     public void setId(String id) {
//         this.id = id;
//     }
// 
// }
// 
// Path: app/src/main/java/dev/wisebite/wisebite/domain/Menu.java
// @Getter
// @Setter
// @AllArgsConstructor(suppressConstructorProperties = true)
// @NoArgsConstructor
// @ToString
// @Builder
// public class Menu implements Entity {
// 
//     private String id;
//     private String name;
//     private Double price;
//     private String description;
// 
//     private Map<String, Object> mainDishes = new LinkedHashMap<>();
//     private Map<String, Object> secondaryDishes = new LinkedHashMap<>();
//     private Map<String, Object> otherDishes = new LinkedHashMap<>();
//     private Map<String, Object> reviews = new LinkedHashMap<>();
// 
//     @Override
//     public String getId() {
//         return id;
//     }
// 
//     @Override
//     public void setId(String id) {
//         this.id = id;
//     }
// 
// }
// 
// Path: app/src/main/java/dev/wisebite/wisebite/firebase/Repository.java
// public abstract class Repository<T extends Entity> implements ChildEventListener {
// 
//     private OnChangedListener listener;
// 
//     /**
//      * Just for the Firebase when needed
//      */
//     public Repository () {
// 
//     }
// 
//     public interface OnChangedListener {
//         enum EventType {Added, Changed, Removed, Moved, Full}
// 
//         void onChanged(EventType type);
//     }
// 
//     public void setOnChangedListener(OnChangedListener listener) {
//         this.listener = listener;
//     }
// 
//     public abstract T insert(T item);
// 
//     public abstract T insertInternal(T item);
// 
//     public abstract T update(T item);
// 
//     public abstract T updateInternal(T item);
// 
//     public abstract void delete(String id);
// 
//     public abstract void deleteInternal(String id);
// 
//     public abstract boolean exists(String id);
// 
//     public abstract T get(String id);
// 
//     public abstract List<T> all();
// 
//     protected void notifyChange(OnChangedListener.EventType type) {
//         if (listener != null){
//             listener.onChanged(type);
//         }
//     }
// 
//     @Override
//     public void onChildAdded(DataSnapshot dataSnapshot, String s) {
//         insertInternal(convert(dataSnapshot));
//         notifyChange(OnChangedListener.EventType.Added);
//     }
// 
//     @Override
//     public void onChildChanged(DataSnapshot dataSnapshot, String s) {
//         updateInternal(convert(dataSnapshot));
//         notifyChange(OnChangedListener.EventType.Changed);
//     }
// 
//     @Override
//     public void onChildRemoved(DataSnapshot dataSnapshot) {
//         deleteInternal(convert(dataSnapshot).getId());
//         notifyChange(OnChangedListener.EventType.Removed);
//     }
// 
//     @Override
//     public void onChildMoved(DataSnapshot dataSnapshot, String s) {
//         updateInternal(convert(dataSnapshot));
//         notifyChange(OnChangedListener.EventType.Moved);
//     }
// 
//     protected abstract T convert(DataSnapshot data);
// 
// }
// 
// Path: app/src/main/java/dev/wisebite/wisebite/utils/Service.java
// public abstract class Service<T extends Entity> {
// 
//     protected final Repository<T> repository;
// 
//     public Service (Repository<T> repository){
//         this.repository = repository;
//     }
// 
//     public T save(T item) {
//         if (repository.exists(item.getId())) return repository.update(item);
//         return repository.insert(item);
//     }
// 
//     public T get(String key) {
//         return repository.get(key);
//     }
// 
//     @SuppressWarnings("unused")
//     public void delete(String key){
//         repository.delete(key);
//     }
// 
//     @SuppressWarnings("unused")
//     public int getAmount(){
//         return repository.all().size();
//     }
// 
//     public List<T> getAll() {
//         return repository.all();
//     }
// 
//     public void setOnChangedListener(Repository.OnChangedListener listener){
//         repository.setOnChangedListener(listener);
//     }
// 
// }


import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Map;
import dev.wisebite.wisebite.domain.Dish;
import dev.wisebite.wisebite.domain.Menu;
import dev.wisebite.wisebite.firebase.Repository;
import dev.wisebite.wisebite.utils.Service;
package dev.wisebite.wisebite.service;



/**
 * Created by albert on 16/04/17.
 * @author albert
 */
public class MenuService extends Service<Menu> {

    private final Repository<Dish> dishRepository;

    public MenuService(Repository<Menu> repository,
                       Repository<Dish> dishRepository) {
        super(repository);
        this.dishRepository = dishRepository;
    }

    public void addDishes(Menu menu, ArrayList<Dish> mainDishes, ArrayList<Dish> secondaryDishes, ArrayList<Dish> otherDishes) {
        Map<String, Object> mainDishesMap = new LinkedHashMap<>();
        for (Dish dish : mainDishes) {
            String insertedId = dishRepository.insert(dish).getId();
            mainDishesMap.put(insertedId, true);
        }
        menu.setMainDishes(mainDishesMap);

        Map<String, Object> secondaryDishesMap = new LinkedHashMap<>();
        for (Dish dish : secondaryDishes) {
            String insertedId = dishRepository.insert(dish).getId();
// Path: app/src/main/java/dev/wisebite/wisebite/domain/Dish.java
// @Getter
// @Setter
// @AllArgsConstructor(suppressConstructorProperties = true)
// @NoArgsConstructor
// @ToString
// @Builder
// public class Dish implements Entity {
// 
//     private String id;
//     private String name;
//     private Double price;
//     private String description;
// 
//     private Map<String, Object> reviews = new LinkedHashMap<>();
// 
// 
//     @Override
//     public String getId() {
//         return id;
//     }
// 
//     @Override
//     public void setId(String id) {
//         this.id = id;
//     }
// 
// }
// 
// Path: app/src/main/java/dev/wisebite/wisebite/domain/Menu.java
// @Getter
// @Setter
// @AllArgsConstructor(suppressConstructorProperties = true)
// @NoArgsConstructor
// @ToString
// @Builder
// public class Menu implements Entity {
// 
//     private String id;
//     private String name;
//     private Double price;
//     private String description;
// 
//     private Map<String, Object> mainDishes = new LinkedHashMap<>();
//     private Map<String, Object> secondaryDishes = new LinkedHashMap<>();
//     private Map<String, Object> otherDishes = new LinkedHashMap<>();
//     private Map<String, Object> reviews = new LinkedHashMap<>();
// 
//     @Override
//     public String getId() {
//         return id;
//     }
// 
//     @Override
//     public void setId(String id) {
//         this.id = id;
//     }
// 
// }
// 
// Path: app/src/main/java/dev/wisebite/wisebite/firebase/Repository.java
// public abstract class Repository<T extends Entity> implements ChildEventListener {
// 
//     private OnChangedListener listener;
// 
//     /**
//      * Just for the Firebase when needed
//      */
//     public Repository () {
// 
//     }
// 
//     public interface OnChangedListener {
//         enum EventType {Added, Changed, Removed, Moved, Full}
// 
//         void onChanged(EventType type);
//     }
// 
//     public void setOnChangedListener(OnChangedListener listener) {
//         this.listener = listener;
//     }
// 
//     public abstract T insert(T item);
// 
//     public abstract T insertInternal(T item);
// 
//     public abstract T update(T item);
// 
//     public abstract T updateInternal(T item);
// 
//     public abstract void delete(String id);
// 
//     public abstract void deleteInternal(String id);
// 
//     public abstract boolean exists(String id);
// 
//     public abstract T get(String id);
// 
//     public abstract List<T> all();
// 
//     protected void notifyChange(OnChangedListener.EventType type) {
//         if (listener != null){
//             listener.onChanged(type);
//         }
//     }
// 
//     @Override
//     public void onChildAdded(DataSnapshot dataSnapshot, String s) {
//         insertInternal(convert(dataSnapshot));
//         notifyChange(OnChangedListener.EventType.Added);
//     }
// 
//     @Override
//     public void onChildChanged(DataSnapshot dataSnapshot, String s) {
//         updateInternal(convert(dataSnapshot));
//         notifyChange(OnChangedListener.EventType.Changed);
//     }
// 
//     @Override
//     public void onChildRemoved(DataSnapshot dataSnapshot) {
//         deleteInternal(convert(dataSnapshot).getId());
//         notifyChange(OnChangedListener.EventType.Removed);
//     }
// 
//     @Override
//     public void onChildMoved(DataSnapshot dataSnapshot, String s) {
//         updateInternal(convert(dataSnapshot));
//         notifyChange(OnChangedListener.EventType.Moved);
//     }
// 
//     protected abstract T convert(DataSnapshot data);
// 
// }
// 
// Path: app/src/main/java/dev/wisebite/wisebite/utils/Service.java
// public abstract class Service<T extends Entity> {
// 
//     protected final Repository<T> repository;
// 
//     public Service (Repository<T> repository){
//         this.repository = repository;
//     }
// 
//     public T save(T item) {
//         if (repository.exists(item.getId())) return repository.update(item);
//         return repository.insert(item);
//     }
// 
//     public T get(String key) {
//         return repository.get(key);
//     }
// 
//     @SuppressWarnings("unused")
//     public void delete(String key){
//         repository.delete(key);
//     }
// 
//     @SuppressWarnings("unused")
//     public int getAmount(){
//         return repository.all().size();
//     }
// 
//     public List<T> getAll() {
//         return repository.all();
//     }
// 
//     public void setOnChangedListener(Repository.OnChangedListener listener){
//         repository.setOnChangedListener(listener);
//     }
// 
// }


// Path: app/src/main/java/dev/wisebite/wisebite/service/MenuService.java
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Map;
import dev.wisebite.wisebite.domain.Dish;
import dev.wisebite.wisebite.domain.Menu;
import dev.wisebite.wisebite.firebase.Repository;
import dev.wisebite.wisebite.utils.Service;

package dev.wisebite.wisebite.service;



/**
 * Created by albert on 16/04/17.
 * @author albert
 */
public class MenuService extends Service<Menu> {

    private final Repository<Dish> dishRepository;

    public MenuService(Repository<Menu> repository,
                       Repository<Dish> dishRepository) {
        super(repository);
        this.dishRepository = dishRepository;
    }

    public void addDishes(Menu menu, ArrayList<Dish> mainDishes, ArrayList<Dish> secondaryDishes, ArrayList<Dish> otherDishes) {
        Map<String, Object> mainDishesMap = new LinkedHashMap<>();
        for (Dish dish : mainDishes) {
            String insertedId = dishRepository.insert(dish).getId();
            mainDishesMap.put(insertedId, true);
        }
        menu.setMainDishes(mainDishesMap);

        Map<String, Object> secondaryDishesMap = new LinkedHashMap<>();
        for (Dish dish : secondaryDishes) {
            String insertedId = dishRepository.insert(dish).getId();
            secondaryDishesMap.put(insertedId, true);