package apps.makarov.com.whereismycurrency.net; import com.squareup.okhttp.OkHttpClient; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.inject.Inject; import apps.makarov.com.whereismycurrency.DateUtils; import apps.makarov.com.whereismycurrency.mappers.realm.BankRealmMapper; import apps.makarov.com.whereismycurrency.mappers.realm.CurrencyPairRealmMapper; import apps.makarov.com.whereismycurrency.mappers.realm.RateRealmMapper; import apps.makarov.com.whereismycurrency.mappers.realm.ResultOperationRealmMapper; import apps.makarov.com.whereismycurrency.mappers.realm.UserHistoryRealmMapper; import apps.makarov.com.whereismycurrency.models.Bank; 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.requests.BankRequest; import apps.makarov.com.whereismycurrency.net.requests.FixerRequest; import apps.makarov.com.whereismycurrency.net.requests.WimcRequest; import apps.makarov.com.whereismycurrency.repository.IRepository; import apps.makarov.com.whereismycurrency.repository.realm.models.CurrencyPairRealm; import apps.makarov.com.whereismycurrency.repository.realm.models.ResultOperationRealm; import apps.makarov.com.whereismycurrency.repository.protocols.ResultOperationProtocol; import rx.Observable; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; //import apps.makarov.com.whereismycurrency.repository.realm.models.Bank; /** * Created by makarov on 26/06/15. */ public class WimcServiceImpl extends RequestService implements WimcService { @Inject public BankRealmMapper bankRealmMapper; @Inject public ResultOperationRealmMapper resultMapper; @Inject public RateRealmMapper rateRealmMapper; @Inject public CurrencyPairRealmMapper currencyPairRealmMapper; @Inject public UserHistoryRealmMapper userHistoryRealmMapper; public WimcServiceImpl(OkHttpClient client, IRepository store) { super(client, store); } @Override public Observable<List<UserHistory>> getHistory() { return Observable.create(new Observable.OnSubscribe<List<UserHistory>>() { @Override public void call(Subscriber<? super List<UserHistory>> subscriber) { try { List<UserHistory> list = getStore().getUserHistory(); subscriber.onNext(list); subscriber.onCompleted(); } catch (Throwable e) { subscriber.onError(e); } } }).observeOn(AndroidSchedulers.mainThread()) .subscribeOn(AndroidSchedulers.mainThread()); } @Override public Observable<List<ResultOperation>> getResultOperations() { return Observable.create(new Observable.OnSubscribe<List<ResultOperation>>() { @Override public void call(Subscriber<? super List<ResultOperation>> subscriber) { try { List<ResultOperationRealm> list = getStore().getAllResultOperation(); List<ResultOperation> resultList = new ArrayList<ResultOperation>(list.size()); for(ResultOperationRealm item : list){ resultList.add(resultMapper.modelToData(item)); } subscriber.onNext(resultList); subscriber.onCompleted(); } catch (Throwable e) { subscriber.onError(e); } } }).observeOn(AndroidSchedulers.mainThread()) .subscribeOn(AndroidSchedulers.mainThread()); } @Override public Observable<List<ResultOperation>> getUpdateResultOperations() { return Observable.create(new Observable.OnSubscribe<List<ResultOperation>>() { @Override public void call(Subscriber<? super List<ResultOperation>> subscriber) { try { List<ResultOperation> list = getStore().getAllResultOperation(); subscriber.onNext(list); subscriber.onCompleted(); } catch (Throwable e) { subscriber.onError(e); } } }).observeOn(AndroidSchedulers.mainThread()) .subscribeOn(AndroidSchedulers.mainThread()); } @Override public Observable<List<Rate>> getRates(final CurrencyPair currencyPair, final Date date) { final WimcRequest bankRequest = new FixerRequest(currencyPair.getBaseCurrency(), date); Observable<List<Rate>> localStoreObservable = Observable.create(new Observable.OnSubscribe<List<Rate>>() { @Override public void call(Subscriber<? super List<Rate>> subscriber) { try { CurrencyPairRealm pair = currencyPairRealmMapper.dataToModel(currencyPair); List<Rate> list = getStore().getRates(pair, date, Bank.DEFAULT); subscriber.onNext(list); subscriber.onCompleted(); } catch (Throwable e) { subscriber.onError(e); } } }).observeOn(AndroidSchedulers.mainThread()) .subscribeOn(AndroidSchedulers.mainThread()); return getObservableRequest(bankRequest, localStoreObservable); } @Override public Observable<List<Rate>> getRatesAllBank(final CurrencyPair currencyPair) { final WimcRequest bankRequest = new BankRequest(); Observable<List<Rate>> localStoreObservable = Observable.create(new Observable.OnSubscribe<List<Rate>>() { @Override public void call(Subscriber<? super List<Rate>> subscriber) { try { // getStore().addUrlToCache(bankRequest.getRequest().urlString()); CurrencyPairRealm pair = currencyPairRealmMapper.dataToModel(currencyPair); List<Rate> list = getStore().getRates(pair, DateUtils.getTodayDate(), Bank.DEFAULT); subscriber.onNext(list); subscriber.onCompleted(); } catch (Throwable e) { subscriber.onError(e); } } }).observeOn(AndroidSchedulers.mainThread()) .subscribeOn(AndroidSchedulers.mainThread()); return getObservableRequest(bankRequest, localStoreObservable); } @Override public UserHistory addHistoryItem(final CurrencyPair currencyPair, final Date date, double summa, double rateValue) { UserHistory userHistory = new UserHistory(); Rate userRate = new Rate(); userRate.setCurrencyPair(currencyPair); userRate.setValue(rateValue); userRate.setBank(Bank.USER_RATE); userHistory.setDate(date); userHistory.setValue(summa); userHistory.setRate(userRate); getStore().saveObject(userHistoryRealmMapper.dataToModel(userHistory)); return userHistory; } @Override public ResultOperation addResult(Rate rate, UserHistory userHistory) { ResultOperation result = new ResultOperation(); result.setUserHistory(userHistory); result.setExitRate(rate); result.setDate(userHistory.getDate()); getStore().saveObject(result); return result; } @Override public ResultOperation addResultInHistory(ResultOperation resultOperation) { ResultOperationProtocol operation = resultMapper.dataToModel(resultOperation); ResultOperationProtocol result = getStore().resultToHistory(operation); return resultMapper.modelToData(result); } @Override public void removeResult(ResultOperation resultOperation) { ResultOperationProtocol operation = resultMapper.dataToModel(resultOperation); getStore().removeResult(operation); } @Override public ResultOperation getResultOperation(String key) { ResultOperationProtocol operation = getStore().getResultOperation(key); ResultOperation operationData = resultMapper.modelToData(operation); return operationData; } // protected Action1 cachingRequest() { // return new Action1<Response>() { // @Override // public void call(Response response) { // getStore().addUrlToCache(response.request().urlString()); // } // }; // } }