package tech.easyflow.publicapi.dto;

import java.io.Serializable;
import java.util.List;

/**
 * Public API 可安全返回的机器可读错误详情。
 */
public class PublicApiErrorDetail implements Serializable {

    private static final long serialVersionUID = 1L;

    private final String requestId;
    private final String location;
    private final String field;
    private final String actual;
    private final List<String> expected;
    private final boolean retryable;

    /**
     * 创建公共错误详情。
     *
     * @param requestId 请求关联标识
     * @param location 错误位置
     * @param field 错误字段
     * @param actual 经脱敏和限长的实际值
     * @param expected 合法值或格式
     * @param retryable 是否适合直接重试
     */
    public PublicApiErrorDetail(
            String requestId,
            String location,
            String field,
            String actual,
            List<String> expected,
            boolean retryable) {
        this.requestId = requestId;
        this.location = location;
        this.field = field;
        this.actual = actual;
        this.expected = expected == null
                ? List.of()
                : List.copyOf(expected);
        this.retryable = retryable;
    }

    /**
     * 获取请求关联标识。
     *
     * @return 请求关联标识
     */
    public String getRequestId() {
        return requestId;
    }

    /**
     * 获取错误位置。
     *
     * @return 错误位置
     */
    public String getLocation() {
        return location;
    }

    /**
     * 获取错误字段。
     *
     * @return 错误字段
     */
    public String getField() {
        return field;
    }

    /**
     * 获取安全实际值。
     *
     * @return 实际值
     */
    public String getActual() {
        return actual;
    }

    /**
     * 获取期望值。
     *
     * @return 不可变期望值列表
     */
    public List<String> getExpected() {
        return expected;
    }

    /**
     * 判断是否适合直接重试。
     *
     * @return 是否可重试
     */
    public boolean isRetryable() {
        return retryable;
    }
}
