package org.xyzh.crontab.task;

import org.springframework.beans.factory.annotation.Autowired;
import org.xyzh.api.system.config.SysConfigService;
import org.xyzh.crontab.pojo.TaskParams;

import java.util.ArrayList;
import java.util.List;

/**
 * @description Python命令任务抽象类（从数据库获取配置）
 * @filename PythonCommandTask.java
 * @author yslg
 * @copyright xyzh
 * @since 2025-11-10
 */
public abstract class PythonCommandTask extends CommandTask {

    @Autowired
    protected SysConfigService sysConfigService;

    /**
     * 获取Python可执行文件路径（从数据库系统配置获取）
     */
    protected String getPythonPath() {
        try {
            String value = sysConfigService.getStringConfig("crawler.pythonPath");
            if (value != null && !value.isEmpty()) {
                return value;
            }
        } catch (Exception e) {
            logger.warn("获取Python路径配置失败，使用默认值: {}", e.getMessage());
        }
        return "python"; // 默认值
    }

    /**
     * 获取脚本基础路径（从数据库系统配置获取）
     */
    protected String getScriptBasePath() {
        try {
            String value = sysConfigService.getStringConfig("crawler.basePath");
            if (value != null && !value.isEmpty()) {
                return value;
            }
        } catch (Exception e) {
            logger.warn("获取脚本基础路径配置失败，使用默认值: {}", e.getMessage());
        }
        return "../schoolNewsCrawler"; // 默认值
    }

    /**
     * 获取工作目录（返回脚本基础路径）
     */
    @Override
    protected String getWorkingDirectory(TaskParams taskParams) {
        return getScriptBasePath();
    }

    /**
     * 构建Python命令
     *
     * 注意: 不使用 cmd /c 或 bash -c，直接调用Python可执行文件
     * 这样可以避免shell对JSON参数中的引号进行错误处理
     * ProcessBuilder可以直接启动exe文件，参数会正确传递
     */
    @Override
    protected List<String> buildCommand(TaskParams taskParams) throws Exception {
        List<String> command = new ArrayList<>();

        // 直接调用Python可执行文件，不使用shell
        command.add(getPythonPath());

        // 添加Python脚本和参数（由子类实现）
        command.addAll(buildPythonArgs(taskParams));

        return command;
    }

    /**
     * 构建Python脚本参数（由子类实现）
     * @param taskParams 任务参数
     * @return Python脚本名称和参数列表
     */
    protected abstract List<String> buildPythonArgs(TaskParams taskParams) throws Exception;
}
