package org.xyzh.crontab.task;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xyzh.crontab.pojo.TaskParams;

/**
 * @description 定时任务基类
 * @filename BaseTask.java
 * @author yslg
 * @copyright xyzh
 * @since 2025-11-10
 */
public abstract class BaseTask {

    protected final Logger logger = LoggerFactory.getLogger(getClass());

    /**
     * 执行任务（统一入口）
     * @param params JSON格式的参数字符串
     */
    public void execute(String params) {
        logger.info("开始执行定时任务，参数: {}", params);

        try {
            // 解析参数
            TaskParams taskParams = parseParams(params);

            if (taskParams == null) {
                logger.error("参数解析失败，任务终止");
                throw new RuntimeException("参数解析失败");
            }

            logger.info("任务分组: {}, 方法名称: {}",
                taskParams.getTaskGroup(), taskParams.getMethodName());

            // 执行具体任务
            doExecute(taskParams);

            logger.info("定时任务执行完成");

        } catch (Exception e) {
            logger.error("定时任务执行异常: ", e);
            throw new RuntimeException("定时任务执行异常", e);
        }
    }

    /**
     * 解析参数
     * @param params 参数字符串
     * @return TaskParams 解析后的参数对象
     */
    protected TaskParams parseParams(String params) {
        return TaskParams.fromJson(params);
    }

    /**
     * 执行具体任务（由子类实现）
     * @param taskParams 任务参数
     */
    protected abstract void doExecute(TaskParams taskParams) throws Exception;
}
