package cgmblelib.ble.gattcallback;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import cgmblelib.utils.MyLog;
import ist.com.sdk.ProtocolTools;

/**
 * 队列 血糖计算
 */
public class LineUpTaskGlucoseProcess {
    /**
     * 链表的血糖数据
     */
    private LinkedList<ProtocolTools.Glucose> lineUpBeans;
    /**
     * 任务监听
     */
    private OnTaskListener onTaskListener;

    /**
     * 设置链表监听
     * @param onTaskListener
     * @return 返回当前类
     */
    public LineUpTaskGlucoseProcess setOnTaskListener(OnTaskListener onTaskListener) {
        this.onTaskListener = onTaskListener;
        return this;
    }

    public LineUpTaskGlucoseProcess() {
        this.lineUpBeans = new LinkedList<>();
    }

    private static class SingletonInstance {
        private static final LineUpTaskGlucoseProcess INSTANCE = new LineUpTaskGlucoseProcess();
    }

    public static LineUpTaskGlucoseProcess getInstance() {
        return SingletonInstance.INSTANCE;
    }


    /**
     * 加入排队
     * @param glucose 一个任务
     */
    public void addTask(ProtocolTools.Glucose glucose){
        if(lineUpBeans != null){
            if (!checkTask()) {
                if (onTaskListener != null) onTaskListener.nextTask(glucose);
            }
            MyLog.i("addTask " + glucose.toString());
            lineUpBeans.addLast(glucose);
        }
    }

    /**
     * 批量加入队列任务
     * @param glucoseList 批量数据
     */
    public void addTasks(List<ProtocolTools.Glucose> glucoseList){
        if(lineUpBeans != null){
            for (ProtocolTools.Glucose glucose:glucoseList){
                lineUpBeans.addLast(glucose);
            }
            if (onTaskListener != null) onTaskListener.nextTask(getFirst());
        }
    }

    /**
     * 检查列表中是否有任务正在执行。
     * @return true 表示有任务正在执行。
     */
    public boolean checkTask(){
        boolean isTask = false;
        if(lineUpBeans != null){
            if(lineUpBeans.size() > 0) isTask = true;
        }
        return isTask;
    }

    /**
     * 得到下一个执行的任务数据
     * @return 返回下一个将要执行的任务， 返回null ,代表没有任务可以执行了
     */
    public ProtocolTools.Glucose getFirst(){
        if(lineUpBeans!=null){
            return lineUpBeans.getFirst();
        }
        return null;
    }

    /**
     * 执行成功之后，删除排队中的任务。
     * @param glucose 数据
     */
    private void deleteTask(ProtocolTools.Glucose glucose){
        if(lineUpBeans != null){
            for(int i = 0; i < lineUpBeans.size();i++){
                ProtocolTools.Glucose task = lineUpBeans.get(i);
                if(glucose.getId() == task.getId()){
                    lineUpBeans.remove(task); // 删除任务
                    break;
                }
            }
        }
    }

    public void completedInitiative() {
        completedInitiative(true);
    }

    /**
     * 主动提前结束队列任务
     */
    public void completedInitiative(boolean isInitiative) {
        if (lineUpBeans != null && lineUpBeans.size() > 0) {
            Iterator<ProtocolTools.Glucose> iterator = lineUpBeans.iterator();
            while (iterator.hasNext()) {
                iterator.next();
                iterator.remove();
            }
        }
        if (onTaskListener != null) {
            onTaskListener.completedTask(isInitiative);
        }
    }

    /**
     * 外部调用,表示任务已经执行完成了,当执行完成一个任务调用
     * @param task 任务执行完了
     */
    public void finishTask(ProtocolTools.Glucose task){
        MyLog.iLog("当前结束,下一个更好");
        deleteTask(task); // 删除已经执行完成的任务。
        if(lineUpBeans != null){
            if(checkTask()){
                if(onTaskListener!=null){
                    onTaskListener.nextTask(lineUpBeans.getFirst());
                }
            } else {
                if(onTaskListener != null){
                    onTaskListener.completedTask(false);
                }
            }
        }
    }

    /**
     * 当第一个任务执行完成，发现列队中还存在任务， 将继续执行下一个任务
     */
    public interface OnTaskListener{
        /**
         * 执行下一个任务
         * @param task 下一个需要执行的任务
         */
        void nextTask(ProtocolTools.Glucose task);

        /**
         *  所有任务执行完成,没有下一个任务了
         * @param isInitiative 是否是主动提前结束，true表示任务提前中止了
         */
        void completedTask(boolean isInitiative);
    }
}
