package com.casic.dcms.vm;

import androidx.lifecycle.MutableLiveData;

import com.casic.dcms.base.BaseApplication;
import com.casic.dcms.model.CaseLargeTypeBean;
import com.casic.dcms.model.CaseProcessBean;
import com.casic.dcms.model.CaseSmallTypeBean;
import com.casic.dcms.model.CaseStatusBean;
import com.casic.dcms.model.ComSentenceBean;
import com.casic.dcms.utils.StringHelper;
import com.casic.dcms.utils.retrofit.RetrofitServiceManager;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.pengxh.androidx.lite.callback.OnObserverCallback;
import com.pengxh.androidx.lite.hub.StringHub;
import com.pengxh.androidx.lite.vm.BaseViewModel;
import com.pengxh.androidx.lite.vm.LoadState;
import com.pengxh.androidx.lite.vm.ObserverSubscriber;

import java.io.IOException;
import java.net.ConnectException;

import okhttp3.ResponseBody;
import rx.Observable;

public class CommonDataViewModel extends BaseViewModel {
    private final Gson gson = new Gson();
    public MutableLiveData<CaseLargeTypeBean> largeTypeModel = new MutableLiveData<>();
    public MutableLiveData<CaseSmallTypeBean> smallTypeModel = new MutableLiveData<>();
    public MutableLiveData<CaseStatusBean> caseStatusModel = new MutableLiveData<>();
    public MutableLiveData<ComSentenceBean> sentenceModel = new MutableLiveData<>();
    public MutableLiveData<CaseProcessBean> caseProcessModel = new MutableLiveData<>();

    public void obtainLargeType(String eorc) {
        Observable<ResponseBody> observable = RetrofitServiceManager.getCaseLargeType(eorc);
        ObserverSubscriber.addSubscribe(observable, new OnObserverCallback() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(ResponseBody responseBody) {
                try {
                    String response = responseBody.string();
                    int responseCode = StringHelper.separateResponseCode(response);
                    if (responseCode == 200) {
                        CaseLargeTypeBean resultBean = gson.fromJson(response, new TypeToken<CaseLargeTypeBean>() {
                        }.getType());
                        largeTypeModel.setValue(resultBean);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public void obtainSmallType(String eorc, String typeId) {
        Observable<ResponseBody> observable = RetrofitServiceManager.getCaseSmallType(eorc, typeId);
        ObserverSubscriber.addSubscribe(observable, new OnObserverCallback() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(ResponseBody responseBody) {
                try {
                    String response = responseBody.string();
                    int responseCode = StringHelper.separateResponseCode(response);
                    if (responseCode == 200) {
                        CaseSmallTypeBean resultBean = gson.fromJson(response, new TypeToken<CaseSmallTypeBean>() {
                        }.getType());
                        smallTypeModel.setValue(resultBean);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public void obtainCaseStatus() {
        Observable<ResponseBody> observable = RetrofitServiceManager.getCaseStatus();
        ObserverSubscriber.addSubscribe(observable, new OnObserverCallback() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(ResponseBody responseBody) {
                try {
                    String response = responseBody.string();
                    int responseCode = StringHelper.separateResponseCode(response);
                    if (responseCode == 200) {
                        CaseStatusBean resultBean = gson.fromJson(response, new TypeToken<CaseStatusBean>() {
                        }.getType());
                        caseStatusModel.setValue(resultBean);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public void obtainCommonSentence() {
        Observable<ResponseBody> observable = RetrofitServiceManager.getCommonSentenceResult();
        ObserverSubscriber.addSubscribe(observable, new OnObserverCallback() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(ResponseBody responseBody) {
                try {
                    String response = responseBody.string();
                    int responseCode = StringHelper.separateResponseCode(response);
                    if (responseCode == 200) {
                        ComSentenceBean resultBean = gson.fromJson(response, new TypeToken<ComSentenceBean>() {
                        }.getType());
                        sentenceModel.setValue(resultBean);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public void obtainCaseProcess(String processId) {
        loadState.setValue(LoadState.Loading);
        Observable<ResponseBody> observable = RetrofitServiceManager.getCaseProcessResult(processId);
        ObserverSubscriber.addSubscribe(observable, new OnObserverCallback() {
            @Override
            public void onCompleted() {
                loadState.setValue(LoadState.Success);
            }

            @Override
            public void onError(Throwable e) {
                loadState.setValue(LoadState.Fail);
                if (e instanceof ConnectException) {
                    StringHub.show(BaseApplication.get(), "连接失败，请检查网络或者服务器");
                } else {
                    StringHub.show(BaseApplication.get(), "服务器异常，请联系管理员");
                }
            }

            @Override
            public void onNext(ResponseBody responseBody) {
                try {
                    String response = responseBody.string();
                    int responseCode = StringHelper.separateResponseCode(response);
                    if (responseCode == 200) {
                        CaseProcessBean resultBean = gson.fromJson(response, new TypeToken<CaseProcessBean>() {
                        }.getType());
                        caseProcessModel.setValue(resultBean);
                    } else {
                        loadState.setValue(LoadState.Fail);
                        StringHelper.showErrorMessage(response);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}
