package com.example.iot_controlhost.utils.control;

import com.example.iot_controlhost.utils.PollingTask;
import com.example.iot_controlhost.utils.global.RxTag;
import com.example.iot_controlhost.utils.log.MyLog;
import com.xuexiang.rxutil2.rxbus.RxBusUtils;

/**
 * @Description 自动控制父类
 * @Author DuanKaiji
 * @CreateTime 2023年11月09日 10:27:46
 */
public abstract class Control {
    /**
     * 是否在开始中
     */
    protected volatile boolean start = false;

    protected PollingTask pollingTask ;

    /**
     * 开始控制
     */
    public synchronized void start() {
        if (start && pollingTask != null && pollingTask.hasActiveTasks()) {
            return;
        }
        if (start) {
            MyLog.autoError("检测到自动控制任务已无有效调度，尝试自恢复：" + getClass().getSimpleName());
        }
        pollingTask = PollingTask.getInstance(getClass().getSimpleName());
        try {
            start = startMethod();
            if (start) {
                MyLog.auto("自动控制启动成功：" + getClass().getSimpleName());
            } else {
                MyLog.autoError("自动控制未启动：" + getClass().getSimpleName() + "，设备不可用或配置不满足");
            }
        } catch (Throwable throwable) {
            start = false;
            MyLog.autoError("自动控制启动异常：" + getClass().getSimpleName() + "，异常="
                    + throwable.getClass().getSimpleName() + "，原因=" + throwable.getMessage());
        }
    }

    /**
     * 开始自动控制的具体实现
     *
     * @return 操作成功与否
     */
    protected abstract boolean startMethod();

    /**
     * 停止控制
     */
    public synchronized void stop() {
        if(pollingTask != null){
            pollingTask.stopAllPollingTasks();
        }
        if (!start) {
            return;
        }
        try {
            stopMethod();
            RxBusUtils.get().post(RxTag.UPDATE_AUTO, 2);
            MyLog.auto("自动控制停止成功：" + getClass().getSimpleName());
        } catch (Throwable throwable) {
            MyLog.autoError("自动控制停止异常：" + getClass().getSimpleName() + "，异常="
                    + throwable.getClass().getSimpleName() + "，原因=" + throwable.getMessage());
        } finally {
            start = false;
            pollingTask = null;
        }
    }

    public boolean isRunning() {
        return start && pollingTask != null && pollingTask.hasActiveTasks();
    }

    /**
     * 停止自动控制的具体实现
     */
    protected abstract void stopMethod();
}
