package apps.makarov.com.whereismycurrency.presenters;
import android.graphics.drawable.Drawable;
import android.util.Log;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import apps.makarov.com.whereismycurrency.R;
import apps.makarov.com.whereismycurrency.models.CurrencyPair;
import apps.makarov.com.whereismycurrency.models.Rate;
import apps.makarov.com.whereismycurrency.models.ResultOperation;
import apps.makarov.com.whereismycurrency.models.UserHistory;
import apps.makarov.com.whereismycurrency.net.WimcService;
import apps.makarov.com.whereismycurrency.view.adapters.CurrencyAdapter;
import apps.makarov.com.whereismycurrency.view.iviews.EnterOperationView;
import rx.Observable;
import rx.Observer;
import rx.Subscriber;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
/**
* Created by makarov on 26/06/15.
*/
public class EnterOperationPresenterImpl implements EnterOperationPresenter {
private static final String TAG = EnterOperationPresenterImpl.class.getSimpleName();
private EnterOperationView mEnterOperationView;
private WimcService mWimcService;
private String mBaseCurrency;
private String mCompareCurrency;
private Date mDate;
private double mRate = 0;
private double mBaseValue = 0;
private double mCompareValue = 0;
private Subscription mGetRateSubscription;
private Subscription mGetOldRateSubscription;
private static Observable<Rate> mGetRateObservable;
private static Observable<Rate> mGetOldRateObservable;
public EnterOperationPresenterImpl(EnterOperationView hotView, WimcService wimcService) {
this.mEnterOperationView = hotView;
this.mWimcService = wimcService;
}
@Override
public void onResume() {
onEnterBaseCurrency(Rate.RUB_CODE);
onEnterCompareCurrency(Rate.EUR_CODE);
onEnterDateOperation(Calendar.getInstance().getTime());
}
@Override
public void onPause() {
}
@Override
public void onDestroy() {
}
@Override
public void onRefresh() {
}
private boolean isValidData(){
if (mCompareCurrency == null || mBaseCurrency == null || mDate == null || mBaseValue == 0 || mRate == 0)
return false;
return true;
}
@Override
public void onEnterOperation() {
if (!isValidData()) {
mEnterOperationView.showErrorView(mEnterOperationView.getContext().getString(R.string.error_not_all_fields));
return;
}
CurrencyPair pair = CurrencyPair.createPair(mBaseCurrency, mCompareCurrency);
final UserHistory userHistory = mWimcService.addHistoryItem(pair, mDate, mBaseValue, mRate);
CurrencyPair inversePair = CurrencyPair.createPair(mCompareCurrency, mBaseCurrency);
mGetRateObservable = getRateObservable(inversePair, mDate);
mGetRateSubscription = mGetRateObservable
.subscribe(new Observer<Rate>() {
@Override
public void onCompleted() {
Log.d(TAG, "onCompleted");
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError", e);
mEnterOperationView.showErrorView(mEnterOperationView.getContext().getString(R.string.error_not_data));
}
@Override
public void onNext(Rate rate) {
Log.d(TAG, "onNext");
ResultOperation result = mWimcService.addResult(rate, userHistory);
mEnterOperationView.addOperation(result.getKey());
}
});
}
@Override
public void onEnterRate(double rate) {
mRate = rate;
correctingValue();
}
@Override
public void onEnterBaseValue(double rate) {
if(mBaseValue != rate) {
mBaseValue = rate;
correctingValue();
}
}
@Override
public void onEnterCompareValue(double rate) {
if(rate != mCompareValue) {
mCompareValue = rate;
correctingValue();
}
}
@Override
public void onEnterDateOperation(Date date) {
mDate = date;
mEnterOperationView.setDateView(date);
processOldRate();
}
@Override
public void onEnterCompareCurrency(String currency) {
Drawable iconDrawable = Rate.getCurrencyIcon(mEnterOperationView.getContext(), currency);
String nameCurrency = Rate.getCurrencyName(mEnterOperationView.getContext(), currency);
mCompareCurrency = currency;
mEnterOperationView.setCompareCurrency(nameCurrency, iconDrawable);
processOldRate();
}
@Override
public void onEnterBaseCurrency(String currency) {
Drawable iconDrawable = Rate.getCurrencyIcon(mEnterOperationView.getContext(), currency);
String nameCurrency = Rate.getCurrencyName(mEnterOperationView.getContext(), currency);
mBaseCurrency = currency;
mEnterOperationView.setBaseCurrency(nameCurrency, iconDrawable);
processOldRate();
}
@Override
public void updateResults(Date date) {
// взять курс по дате и обновить всю историю с exitRete этого курса
}
@Override
public void onOpenCompareCurrencyDialog() {
mEnterOperationView.setSellCurrencyList(new CurrencyAdapter(mEnterOperationView.getContext(), Rate.getCodesList()));
}
@Override
public void onOpenBaseCurrencyDialog() {
mEnterOperationView.setBuyCurrencyList(new CurrencyAdapter(mEnterOperationView.getContext(), Rate.getCodesList()));
}
@Override
public void correctingValue() {
if(mBaseValue != 0 && mRate != 0){
mCompareValue = mBaseValue * mRate;
mEnterOperationView.setCompareValue(mCompareValue);
}
}
private Observable<Rate> getOldRateObservable(CurrencyPair currencyPair, Date date) {
return mWimcService
.getRates(currencyPair, date)
.flatMap(new Func1<List<Rate>, Observable<Rate>>() {
@Override
public Observable<Rate> call(final List<Rate> rates) {
return Observable.create(new Observable.OnSubscribe<Rate>() {
@Override
public void call(Subscriber<? super Rate> subscriber) {
try {
// first rate
subscriber.onNext(rates.get(0));
subscriber.onCompleted();
} catch (Throwable e) {
subscriber.onError(e);
}
}
});
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.cache();
}
private Observable<Rate> getRateObservable(CurrencyPair currencyPair, Date date) {
return mWimcService
.getRates(currencyPair, date)
.flatMap(new Func1<List<Rate>, Observable<Rate>>() {
@Override
public Observable<Rate> call(final List<Rate> rates) {
return Observable.create(new Observable.OnSubscribe<Rate>() {
@Override
public void call(Subscriber<? super Rate> subscriber) {
try {
//search min rate
subscriber.onNext(rates.get(0));
subscriber.onCompleted();
} catch (Throwable e) {
subscriber.onError(e);
}
}
});
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.cache();
}
private void processOldRate() {
if (mCompareCurrency == null || mBaseCurrency == null || mDate == null)
return;
CurrencyPair pair = CurrencyPair.createPair(mBaseCurrency, mCompareCurrency);
mGetOldRateObservable = getOldRateObservable(pair, mDate);
mGetOldRateSubscription = mGetOldRateObservable
.subscribe(new Observer<Rate>() {
@Override
public void onCompleted() {
Log.d(TAG, "onCompleted");
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError", e);
mEnterOperationView.setOldRate("");
}
@Override
public void onNext(Rate rate) {
Log.d(TAG, "onNext");
mEnterOperationView.setOldRate(String.valueOf(rate.getValue()));
}
});
}
}