package com.code44.finance.api.requests;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import com.code44.finance.api.User;
import com.code44.finance.backend.endpoint.transactions.Transactions;
import com.code44.finance.backend.endpoint.transactions.model.TransactionEntity;
import com.code44.finance.common.utils.Preconditions;
import com.code44.finance.data.Query;
import com.code44.finance.data.db.Tables;
import com.code44.finance.data.model.Account;
import com.code44.finance.data.model.Category;
import com.code44.finance.data.model.Model;
import com.code44.finance.data.providers.AccountsProvider;
import com.code44.finance.data.providers.CategoriesProvider;
import com.code44.finance.data.providers.TransactionsProvider;
import com.code44.finance.utils.IOUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class GetTransactionsRequest extends GetRequest<TransactionEntity> {
private final Transactions transactionsService;
private final Map<String, Account> accounts;
private final Map<String, Category> categories;
public GetTransactionsRequest(Context context, User user, Transactions transactions) {
super(null, context, user);
Preconditions.notNull(transactions, "Transactions cannot be null.");
this.transactionsService = transactions;
accounts = new HashMap<>();
categories = new HashMap<>();
}
@Override protected long getLastTimestamp(User user) {
return user.getTransactionsTimestamp();
}
@Override protected List<TransactionEntity> performRequest(long timestamp) throws Exception {
return transactionsService.list(timestamp).execute().getItems();
}
@Override protected Model getModelFrom(TransactionEntity entity) {
return null;
}
@Override protected void saveNewTimestamp(User user, long newTimestamp) {
user.setTransactionsTimestamp(newTimestamp);
}
@Override protected Uri getSaveUri() {
return TransactionsProvider.uriTransactions();
}
private Account getAccountFor(String id) {
Account account = accounts.get(id);
if (account == null) {
final Cursor cursor = Query.create()
.projectionLocalId(Tables.Accounts.LOCAL_ID)
.projection(Tables.Accounts.PROJECTION)
.projection(Tables.Currencies.PROJECTION)
.selection(Tables.Accounts.ID + "=?", id)
.from(getContext(), AccountsProvider.uriAccounts())
.execute();
account = Account.from(cursor);
IOUtils.closeQuietly(cursor);
accounts.put(id, account);
}
return account;
}
private Category getCategoryFor(TransactionEntity entity) {
Category category = categories.get(entity.getId());
if (category == null) {
final Cursor cursor = Query.create()
.projectionLocalId(Tables.Categories.LOCAL_ID)
.projection(Tables.Categories.PROJECTION)
.selection(Tables.Accounts.ID + "=?", entity.getId())
.from(getContext(), CategoriesProvider.uriCategories())
.execute();
category = Category.from(cursor);
IOUtils.closeQuietly(cursor);
categories.put(entity.getId(), category);
}
return category;
}
}