package ai.pai.lensman.session;

import android.content.Intent;

import com.android.common.utils.LogHelper;

import java.util.ArrayList;

import ai.pai.lensman.App;
import ai.pai.lensman.BuildConfig;
import ai.pai.lensman.bean.PhotoBean;
import ai.pai.lensman.bean.SessionBean;
import ai.pai.lensman.db.DBService;
import ai.pai.lensman.db.Preferences;
import ai.pai.lensman.main.QueryBoxStatusInteractor;
import ai.pai.lensman.service.UploadService;


public class SessionPresenter implements SessionContract.Presenter, SessionInteractor.SessionListener,
        QueryBoxStatusInteractor.BoxStatusListener {

    private SessionInteractor interactor;
    private QueryBoxStatusInteractor boxStatusInteractor;
    private ArrayList<PhotoBean> photoList;
    private SessionContract.View sessionView;
    private SessionBean sessionBean;
    private boolean isWorking;

    private static final String TAG = "SessionPresenter";

    public SessionPresenter(SessionBean sessionBean, SessionContract.View view) {
        this.sessionView = view;
        this.sessionBean = sessionBean;
    }

    @Override
    public void start() {
        LogHelper.d(TAG,"SessionPresenter start "+sessionBean);
        interactor = new SessionInteractor(sessionBean, this);
        boxStatusInteractor = new QueryBoxStatusInteractor(this);
        photoList = DBService.getInstance().getPhotoListBySessionId(sessionBean.sessionId);
        if (photoList.size() == 0) {
            LogHelper.d(TAG,"SessionPresenter start and found no old photos");
            sessionView.showEmptyView();
        } else {
            LogHelper.d(TAG,"SessionPresenter start and found  old photos, size = "+photoList.size());
            sessionView.showPhotoRecyclerView();
            for (PhotoBean photoBean : photoList) {
                sessionView.addNewPhoto(photoBean);
            }
        }
        interactor.startSession();
        boxStatusInteractor.startJob();
        Preferences.getInstance().setCurrentSession(sessionBean.sessionId);
    }

    @Override
    public void stop() {
        boxStatusInteractor.cancelJob();
        interactor.endSession();
        Preferences.getInstance().setCurrentSession("");
        isWorking = false;
        LogHelper.d(TAG,"stop");
    }

    @Override
    public void onSessionStartSuccess(String session) {
        isWorking = true;
        sessionView.showToast("session启动成功");
        LogHelper.d(TAG,"onSessionStartSuccess session启动成功"+session);
    }

    @Override
    public void onSessionStartError(String session) {
        if (!isWorking) {
            return;
        }
        sessionView.showToast("session启动失败,自动重试中");
        interactor.startSession();
        LogHelper.d(TAG,"onSessionStartError session启动失败,自动重试中");
    }

    @Override
    public void onSessionPhotoCaptured(final PhotoBean bean) {
        if (!isWorking) {
            return;
        }
        if(BuildConfig.isTestMode){
            if(photoList!=null && photoList.size()>5){
                return;
            }
        }
        LogHelper.d(TAG,"onSessionPhotoCaptured "+bean);
        DBService.getInstance().addPhotoBean(bean);
        sessionView.showPhotoRecyclerView();
        sessionView.addNewPhoto(bean);
        photoList.add(0,bean);
        App.getAppContext().startService(new Intent(App.getAppContext(), UploadService.class));
    }

    @Override
    public void onSessionEnd(String session) {
        LogHelper.d(TAG,"onSessionEnd "+session);
    }

    @Override
    public void swipeToDeletePhoto(int index) {
        if(index<0 || index>= photoList.size()){
            return;
        }
        PhotoBean photoBean = photoList.get(index);
        photoList.remove(photoBean);
        DBService.getInstance().deletePhotoBean(photoBean);
        interactor.deletePhoto(photoBean);
    }

    @Override
    public void change2QRCodeSessionId(String sessionId) {
        LogHelper.d(TAG,"change2QRCodeSessionId 使用新sessionId = "+sessionId);
        this.sessionBean.sessionId = sessionId;
        stop();
        start();
    }

    @Override
    public void onBoxStatusFetched(String boxNo, String boxStatus, String boxStatusCode) {
        LogHelper.d(TAG,"onBoxStatusFetched 盒子当前状态 "+boxStatus+" code = "+boxStatusCode);
        if("0".equals(boxStatusCode)){
            sessionView.showBoxConnectedView();
        }else{
            sessionView.showBoxDisconnectedView();
        }
    }
}
