package co.smartreceipts.android.ocr.widget.configuration;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.google.common.base.Preconditions;
import java.math.BigDecimal;
import java.util.List;
import javax.inject.Inject;
import co.smartreceipts.android.analytics.Analytics;
import co.smartreceipts.android.analytics.events.DataPoint;
import co.smartreceipts.android.analytics.events.DefaultDataPointEvent;
import co.smartreceipts.android.analytics.events.Events;
import co.smartreceipts.android.di.scopes.FragmentScope;
import co.smartreceipts.android.identity.IdentityManager;
import co.smartreceipts.android.identity.store.EmailAddress;
import co.smartreceipts.android.ocr.purchases.OcrPurchaseTracker;
import co.smartreceipts.android.purchases.PurchaseManager;
import co.smartreceipts.android.purchases.model.AvailablePurchase;
import co.smartreceipts.android.purchases.model.PurchaseFamily;
import co.smartreceipts.android.purchases.source.PurchaseSource;
import co.smartreceipts.android.settings.UserPreferenceManager;
import co.smartreceipts.android.settings.catalog.UserPreference;
import co.smartreceipts.android.utils.log.Logger;
import io.reactivex.Observable;
import io.reactivex.Single;
import io.reactivex.android.schedulers.AndroidSchedulers;
@FragmentScope
public class OcrConfigurationInteractor {
private final IdentityManager identityManager;
private final OcrPurchaseTracker ocrPurchaseTracker;
private final PurchaseManager purchaseManager;
private final UserPreferenceManager userPreferenceManager;
private final Analytics analytics;
@Inject
public OcrConfigurationInteractor(@NonNull IdentityManager identityManager, @NonNull OcrPurchaseTracker ocrPurchaseTracker,
@NonNull PurchaseManager purchaseManager, @NonNull UserPreferenceManager userPreferenceManager,
@NonNull Analytics analytics) {
this.identityManager = Preconditions.checkNotNull(identityManager);
this.ocrPurchaseTracker = Preconditions.checkNotNull(ocrPurchaseTracker);
this.purchaseManager = Preconditions.checkNotNull(purchaseManager);
this.userPreferenceManager = Preconditions.checkNotNull(userPreferenceManager);
this.analytics = Preconditions.checkNotNull(analytics);
}
@Nullable
public EmailAddress getEmail() {
return identityManager.getEmail();
}
@NonNull
public Observable<Integer> getRemainingScansStream() {
return ocrPurchaseTracker.getRemainingScansStream()
.observeOn(AndroidSchedulers.mainThread());
}
@NonNull
public Single<List<AvailablePurchase>> getAvailableOcrPurchases() {
return purchaseManager.getAllAvailablePurchases()
.flatMapIterable(availablePurchases -> availablePurchases)
.filter(availablePurchase -> availablePurchase.getInAppPurchase() != null && PurchaseFamily.Ocr.equals(availablePurchase.getInAppPurchase().getPurchaseFamily()))
.toSortedList((purchase1, purchase2) -> new BigDecimal(purchase1.getPriceAmountMicros()).compareTo(new BigDecimal(purchase2.getPriceAmountMicros())))
.observeOn(AndroidSchedulers.mainThread());
}
public void startOcrPurchase(@NonNull AvailablePurchase availablePurchase) {
if (availablePurchase.getInAppPurchase() != null) {
analytics.record(new DefaultDataPointEvent(Events.Ocr.OcrPurchaseClicked).addDataPoint(new DataPoint("sku", availablePurchase.getInAppPurchase())));
purchaseManager.initiatePurchase(availablePurchase.getInAppPurchase(), PurchaseSource.Ocr);
} else {
Logger.error(this, "Unexpected state in which the in app purchase is null");
}
}
@NonNull
public Observable<Boolean> getOcrIsEnabled() {
return userPreferenceManager.getObservable(UserPreference.Misc.OcrIsEnabled);
}
public void setOcrIsEnabled(boolean ocrIsEnabled) {
analytics.record(new DefaultDataPointEvent(Events.Ocr.OcrIsEnabledToggled).addDataPoint(new DataPoint("value", ocrIsEnabled)));
userPreferenceManager.set(UserPreference.Misc.OcrIsEnabled, ocrIsEnabled);
}
@NonNull
public Observable<Boolean> getAllowUsToSaveImagesRemotely() {
return userPreferenceManager.getObservable(UserPreference.Misc.OcrIncognitoMode)
.map(incognito -> !incognito);
}
public void setAllowUsToSaveImagesRemotely(boolean saveImagesRemotely) {
analytics.record(new DefaultDataPointEvent(Events.Ocr.OcrIncognitoModeToggled).addDataPoint(new DataPoint("value", !saveImagesRemotely)));
userPreferenceManager.set(UserPreference.Misc.OcrIncognitoMode, !saveImagesRemotely);
}
}