package com.agent.management.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 工作流全局配置。
 *
 * <p>对应 {@code application.yml} 的 {@code workflow} 配置段：</p>
 * <pre>
 * workflow:
 *   run-dir: ./data/workflow-runs
 *   llm:
 *     retry:
 *       runtime-max-retries: 2
 *       format-max-retries: 2
 *       retry-on-parse-error: true
 *       retry-on-missing-required: true
 *       retry-on-type-mismatch: true
 *       retry-on-key-name-mismatch: true
 * </pre>
 */
@Data
@Component
@ConfigurationProperties(prefix = "workflow")
public class WorkflowProperties {

    /**
     * 工作流运行目录。
     */
    private String runDir;

    /**
     * LLM 类节点的全局默认配置。
     */
    private Llm llm = new Llm();

    @Data
    public static class Llm {
        /**
         * 重试策略默认值（可被节点级配置覆盖）。
         */
        private Retry retry = new Retry();
    }

    @Data
    public static class Retry {
        /**
         * 运行异常重试次数（含首次）。每次都会重新完整推理。
         */
        private int runtimeMaxRetries = 2;

        /**
         * 格式错误重试次数（含首次）。每次仅把上次响应 + JSON 模板回喂 LLM 重组 JSON。
         */
        private int formatMaxRetries = 2;

        /**
         * JSON 解析失败时是否重试。
         */
        private boolean retryOnParseError = true;

        /**
         * 必填字段缺失时是否重试。
         */
        private boolean retryOnMissingRequired = true;

        /**
         * 类型不匹配时是否重试。
         */
        private boolean retryOnTypeMismatch = true;

        /**
         * strict 模式下检测到键名缺失（如返回中文键名）时是否重试。
         */
        private boolean retryOnKeyNameMismatch = true;
    }
}
