package com.zht.baseproject.http;

import android.util.Log;

import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Func1;
import rx.schedulers.Schedulers;


/**
 * Created by ZHT on 2017/4/19.
 * 对错误进行统一处理,并对返回的数据HttpResult中获取Results
 */

public class HttpTransformer<R extends HttpResult<T>, T> implements Observable.Transformer<R, T> {

    private static final String TAG = "HttpTransformer";

    @Override
    public Observable<T> call(Observable<R> rObservable) {
        return rObservable.flatMap(new Func1<R, Observable<T>>() {
            @Override
            public Observable<T> call(R r) {

                Log.d(TAG, r.isError() ? "HttpResult is error" : "HttpResult is right");

                if (r.isError()) {
                    return Observable.error(new ApiException("网络出错"));
                } else {
                    return createData(r.getResults());
                }
            }
        }).subscribeOn(Schedulers.io()).unsubscribeOn(Schedulers.io()).subscribeOn(AndroidSchedulers.mainThread()).observeOn(AndroidSchedulers.mainThread());
    }

    private Observable<T> createData(final T data) {
        return Observable.create(new Observable.OnSubscribe<T>() {
            @Override
            public void call(Subscriber<? super T> subscriber) {
                try {
                    subscriber.onNext(data);
                } catch (Exception e) {
                    subscriber.onError(e);
                } finally {
                    subscriber.onCompleted();
                }
            }
        });
    }
}