package tech.easyflow.job.support;

import tech.easyflow.common.constant.enums.EnumJobType;
import tech.easyflow.common.web.exceptions.BusinessException;
import tech.easyflow.job.entity.SysJob;
import tech.easyflow.job.job.JobConstant;

import java.math.BigInteger;
import java.util.Map;

/**
 * 工作流类型定时任务的引用解析工具。
 */
public final class SysJobWorkflowReferenceSupport {

    private SysJobWorkflowReferenceSupport() {
    }

    /**
     * 判断任务是否为工作流类型。
     *
     * @param job 定时任务
     * @return 工作流类型时为 true
     */
    public static boolean isWorkflowJob(SysJob job) {
        return job != null
                && Integer.valueOf(EnumJobType.TINY_FLOW.getCode()).equals(job.getJobType());
    }

    /**
     * 解析工作流 ID；参数缺失或格式非法时返回 null。
     *
     * @param job 定时任务
     * @return 工作流 ID，无法解析时为 null
     */
    public static BigInteger resolveWorkflowId(SysJob job) {
        if (!isWorkflowJob(job)) {
            return null;
        }
        Map<String, Object> jobParams = job.getJobParams();
        Object workflowId = jobParams == null ? null : jobParams.get(JobConstant.WORKFLOW_KEY);
        if (workflowId == null) {
            return null;
        }
        String value = String.valueOf(workflowId).trim();
        if (value.isEmpty()) {
            return null;
        }
        try {
            return new BigInteger(value);
        } catch (NumberFormatException ignored) {
            return null;
        }
    }

    /**
     * 获取有效的工作流 ID。
     *
     * @param job 定时任务
     * @return 工作流 ID
     * @throws BusinessException 工作流参数缺失或格式非法时抛出
     */
    public static BigInteger requireWorkflowId(SysJob job) {
        BigInteger workflowId = resolveWorkflowId(job);
        if (workflowId == null) {
            throw new BusinessException("定时任务未配置有效工作流，请重新选择");
        }
        return workflowId;
    }
}
