package de.fau.cs.mad.fablab.android.model;
import android.util.Log;
import com.j256.ormlite.dao.RuntimeExceptionDao;
import com.j256.ormlite.stmt.QueryBuilder;
import java.sql.SQLException;
import java.util.List;
import de.fau.cs.mad.fablab.android.model.entities.Cart;
import de.fau.cs.mad.fablab.android.model.entities.CartEntry;
import de.fau.cs.mad.fablab.android.model.events.ProductsChangedEvent;
import de.fau.cs.mad.fablab.android.viewmodel.common.ObservableArrayList;
import de.fau.cs.mad.fablab.rest.core.CartStatus;
import de.greenrobot.event.EventBus;
public class CartModel {
private static final String LOG_TAG = "CartModel";
private RuntimeExceptionDao<Cart, Long> mCartDao;
private Cart mCart;
private ObservableArrayList<CartEntry> mCartEntries;
public CartModel(RuntimeExceptionDao<Cart, Long> cartDao) {
mCartDao = cartDao;
QueryBuilder<Cart, Long> queryBuilder = cartDao.queryBuilder();
try {
queryBuilder.where().eq("status", CartStatus.SHOPPING);
mCart = cartDao.queryForFirst(queryBuilder.prepare());
} catch (SQLException e) {
Log.e(LOG_TAG, "Failed to load cart from database", e);
}
mCartEntries = new ObservableArrayList<>();
if (mCart != null) {
mCartEntries.addAll(mCart.getEntries());
} else {
createNewCart();
}
EventBus.getDefault().register(this);
}
private void createNewCart() {
mCart = new Cart();
mCartDao.create(mCart);
mCartDao.refresh(mCart);
mCartEntries.clear();
}
public ObservableArrayList<CartEntry> getCartEntries() {
return mCartEntries;
}
public void addEntry(CartEntry entry) {
mCartEntries.add(mCart.addEntry(entry));
}
public void addEntry(CartEntry entry, int position)
{
mCartEntries.add(position, mCart.addEntry(entry));
}
public void removeEntry(CartEntry entry) {
mCart.removeEntry(entry);
mCartEntries.remove(entry);
}
public void updateEntry(CartEntry entry) {
mCart.updateEntry(entry);
}
public double getTotalPrice() {
return mCart.getTotalPrice();
}
public void markCartAsPaid() {
mCart.setStatus(CartStatus.PAID);
mCartDao.update(mCart);
createNewCart();
}
@SuppressWarnings("unused")
public void onEventMainThread(ProductsChangedEvent event) {
for (CartEntry e : mCart.getEntries()) {
if (e.getProduct() == null) {
mCart.getEntries().remove(e);
}
}
mCartEntries.clear();
mCartEntries.addAll(mCart.getEntries());
}
public List<Cart> getAllCarts() {
List<Cart> carts = mCartDao.queryForEq("status", CartStatus.PAID);
if (mCartEntries.size() > 0) {
carts.add(mCart);
}
return carts;
}
}