package store.panda.client.presentation.screens.cartandordering.payment import store.panda.client.data.model.Cart import store.panda.client.data.remote.params.OrderHistoryQueryBuilder import store.panda.client.data.remote.postparams.DeleteCartItemsParams import store.panda.client.domain.analytics.PandaoAnalytics import store.panda.client.domain.analytics.common.CustomParams import store.panda.client.domain.analytics.custom.AppsFlyerAnalyticsManager import store.panda.client.domain.analytics.custom.CustomerTrackManager import store.panda.client.domain.analytics.custom.FirebaseAnalyticsManager import store.panda.client.domain.provider.CartProvider import store.panda.client.domain.provider.OrderHistoryProvider import store.panda.client.presentation.base.BasePresenter import timber.log.Timber import javax.inject.Inject private const val ORDERS_CHECK_LIMIT = 2 private const val ONE_ELEMENT = 1 private const val OFFSET = 0 class PaymentPresenter @Inject constructor( private val trackManager: CustomerTrackManager, private val orderHistoryProvider: OrderHistoryProvider, private val cartProvider: CartProvider, private val appsFlyerAnalyticsManager: AppsFlyerAnalyticsManager, private val firebaseAnalyticsManager: FirebaseAnalyticsManager ) : BasePresenter() { private var paymentDone: Boolean = false fun onViewCreate(url: String, paymentFinished: Boolean) { if (paymentFinished) { mvpView.showSuccessView() } else { mvpView.loadUrl(url) } } fun performSuccessfullPayment(cart: Cart) { if (paymentDone || mvpView == null) { return } paymentDone = true mvpView.apply { setPaymentFinishedState() loadUrl("") hideWebView() showClearCartProgressView() } appsFlyerAnalyticsManager.trackUserStatus(true) trackPaymentAnalytics(cart) subscribe(cartProvider.deleteCartItems( DeleteCartItemsParams(null)), { mvpView.showSuccessView() }, { mvpView.showSuccessView() } ) } private fun trackPaymentAnalytics(cart: Cart) { subscribe(orderHistoryProvider.getOrdersLimited(OrderHistoryQueryBuilder() .limit(ORDERS_CHECK_LIMIT) .offset(OFFSET)) .doOnNext { purchases -> if (!trackManager.hasTrackedPayments()) { if (purchases.size == ONE_ELEMENT) { trackManager.trackFirstPayment( CustomParams(appsFlyerAnalyticsManager.getPurchaseParams(purchases.first(), cart))) } else { trackManager.markPaymentAsTracked() } } } .map { it.first() } .doOnNext { PandaoAnalytics.trackShared( PandaoAnalytics.PandaoEvent.ACTION_MAKE_ORDER, CustomParams( appsFlyerAnalyticsManager.getPurchaseParams(it, cart), firebaseAnalyticsManager.getPurchaseParams(cart) ) ) } .flatMapIterable { purchase -> purchase.orders.map { Pair(purchase, it.id) } } .flatMap { pair -> orderHistoryProvider.getOrderById(pair.second.toString()).map { Pair(pair.first, it) } } .cache(), { pair -> for (item in pair.second.items) { PandaoAnalytics.trackShared( PandaoAnalytics.PandaoEvent.AF_PURCHASE, CustomParams(appsFlyerAnalyticsManager.getOrderParams(pair.first, pair.second, item)) ) } }, { e -> Timber.e(e) trackManager.markPaymentAsTracked() }) } fun performFailPayment() { mvpView.showErrorPaymentDialog() } }