package com.mozu.mozuandroidinstoreassistant.app.customer.loaders;
import android.content.Context;
import android.text.TextUtils;
import com.crashlytics.android.Crashlytics;
import com.mozu.api.MozuApiContext;
import com.mozu.api.contracts.customer.CustomerAccount;
import com.mozu.api.contracts.customer.CustomerAccountCollection;
import com.mozu.api.resources.commerce.customer.CustomerAccountResource;
import com.mozu.mozuandroidinstoreassistant.app.loaders.InternetConnectedAsyncTaskLoader;
import java.util.ArrayList;
import java.util.List;
public class CustomersLoader extends InternetConnectedAsyncTaskLoader<List<CustomerAccount>> {
private static final int ITEMS_PER_PAGE = 200;
private static final String CUSTOMER_CUSTOMER_NUMBER = "id";
private static final String CUSTOMER_CUSTOMER_LIFETIME_VALUE = "commercesummary.totalorderamount";
private static final String SORT_CUSTOMER_ASC = "asc";
private static final String SORT_CUSTOMER_DSC = "desc";
private String mCurrentOrderBy = "";
private List<CustomerAccount> mCustomersList;
private Integer mTenantId;
private Integer mSiteId;
private int mCurrentPage;
private int mTotalPages;
private boolean mIsLoading;
private String mSearchQueryFilter;
private String mCurrentSort;
public CustomersLoader(Context context, Integer tenantId, Integer siteId) {
super(context);
mTenantId = tenantId;
mSiteId = siteId;
mCurrentSort = SORT_CUSTOMER_DSC;
mCurrentOrderBy = CUSTOMER_CUSTOMER_NUMBER;
init();
}
public CustomersLoader(Context context, Integer tenantId, Integer siteId, String query) {
super(context);
mTenantId = tenantId;
mSiteId = siteId;
mSearchQueryFilter = query;
mCurrentSort = SORT_CUSTOMER_DSC;
mCurrentOrderBy = CUSTOMER_CUSTOMER_NUMBER;
init();
}
public boolean isSortAsc() {
return SORT_CUSTOMER_ASC.equals(mCurrentSort);
}
protected void init() {
cancelLoad();
mCurrentPage = 0;
mTotalPages = 0;
mIsLoading = false;
if(mSearchQueryFilter == null) {
mSearchQueryFilter = "";
}
mCustomersList = new ArrayList<CustomerAccount>();
}
@Override
protected void onForceLoad() {
super.onForceLoad();
}
@Override
public List<CustomerAccount> loadInBackground() {
mIsLoading = true;
super.loadInBackground();
mCustomersList.addAll(loadCustomersFromWeb());
List<CustomerAccount> tmpCustomer = new ArrayList<CustomerAccount>();
tmpCustomer.addAll(mCustomersList);
mCustomersList = null;
mCustomersList = new ArrayList<CustomerAccount>(tmpCustomer);
mIsLoading = false;
return mCustomersList;
}
@Override
public void deliverResult(List<CustomerAccount> data) {
if (isReset())
return;
if (isStarted())
super.deliverResult(data);
}
@Override
protected void onStartLoading() {
if (mCustomersList == null) {
mCustomersList = new ArrayList<CustomerAccount>();
}
if (takeContentChanged())
forceLoad();
}
@Override
protected void onStopLoading() {
mIsLoading = false;
cancelLoad();
}
@Override
public void onCanceled(List<CustomerAccount> data) {
mIsLoading = false;
super.onCanceled(data);
}
@Override
protected void onReset() {
onStopLoading();
mCustomersList = null;
init();
super.onReset();
}
private List<CustomerAccount> loadCustomersFromWeb() {
List<CustomerAccount> allCustomers = new ArrayList<CustomerAccount>();
CustomerAccountCollection customerCollection;
CustomerAccountResource customerResource = new CustomerAccountResource(new MozuApiContext(mTenantId, mSiteId));
try {
if (!TextUtils.isEmpty(mSearchQueryFilter)) {String filter = "firstName sw " + mSearchQueryFilter + " or lastName sw " + mSearchQueryFilter + " or emailAddress cont " + mSearchQueryFilter;
customerCollection = customerResource.getAccounts(mCurrentPage * ITEMS_PER_PAGE, ITEMS_PER_PAGE, null, filter, null, null, null, false, null);
} else {
customerCollection = customerResource.getAccounts(mCurrentPage * ITEMS_PER_PAGE, ITEMS_PER_PAGE, mCurrentOrderBy +" "+mCurrentSort, null, null, null, null, false, null);
}
mTotalPages = (int) Math.ceil(customerCollection.getTotalCount() * 1.0f / ITEMS_PER_PAGE * 1.0f);
mCurrentPage += 1;
allCustomers = customerCollection.getItems();
} catch (Exception e) {
Crashlytics.logException(e);
}
return allCustomers;
}
public boolean hasMoreResults() {
return mCurrentPage < mTotalPages;
}
public boolean isLoading() {
return mIsLoading;
}
public void setFilter(String filter) {
mSearchQueryFilter = filter;
}
public void removeFilter() {
mSearchQueryFilter = "";
}
private void toggleCurrentSortCustomer(){
if (SORT_CUSTOMER_DSC.equalsIgnoreCase(mCurrentSort)) {
mCurrentSort = SORT_CUSTOMER_ASC;
} else {
mCurrentSort = SORT_CUSTOMER_DSC;
}
}
public void customerByNumber() {
mCurrentPage = 0;
if (CUSTOMER_CUSTOMER_NUMBER.equalsIgnoreCase(mCurrentOrderBy)) {
toggleCurrentSortCustomer();
} else {
mCurrentOrderBy = CUSTOMER_CUSTOMER_NUMBER;
mCurrentSort = SORT_CUSTOMER_DSC;
}
}
//TODO: Unsupported Sort Operations
// public void customerByLastName() {
// mCurrentPage = 0;
// if (CUSTOMER_LAST_NAME.equalsIgnoreCase(mCurrentOrderBy)) {
// toggleCurrentSortCustomer();
// } else {
// mCurrentOrderBy = CUSTOMER_LAST_NAME;
// mCurrentSort = SORT_CUSTOMER_DSC;
// }
// }
//
// public void customerByFirstName() {
// mCurrentPage = 0;
// if (CUSTOMER_FIRST_NAME.equalsIgnoreCase(mCurrentOrderBy)) {
// toggleCurrentSortCustomer();
// } else {
// mCurrentOrderBy = CUSTOMER_FIRST_NAME;
// mCurrentSort = SORT_CUSTOMER_DSC;
// }
//
// }
//
// public void customerByEmail() {
// mCurrentPage = 0;
// if (CUSTOMER_CUSTOMER_EMAIL.equalsIgnoreCase(mCurrentOrderBy)) {
// toggleCurrentSortCustomer();
// } else {
// mCurrentOrderBy = CUSTOMER_CUSTOMER_EMAIL;
// mCurrentSort = SORT_CUSTOMER_DSC;
// }
// }
public void customerByTotal() {
mCurrentPage = 0;
if (CUSTOMER_CUSTOMER_LIFETIME_VALUE.equalsIgnoreCase(mCurrentOrderBy)) {
toggleCurrentSortCustomer();
} else {
mCurrentOrderBy = CUSTOMER_CUSTOMER_LIFETIME_VALUE;
mCurrentSort = SORT_CUSTOMER_DSC;
}
}
public void clearOrdering() {
mCurrentOrderBy = "";
}
}