package com.spot.exception;

import com.spot.enums.MessageCode;

/**
 * 业务异常，携带多语言错误码和可选参数
 * 抛出后由 Controller 层根据 lang 取对应语言文本响应给前端
 *
 * @author jean
 * @date 2026-05-11
 */
public class BizException extends RuntimeException {

    /** 业务错误码 */
    private final MessageCode messageCode;

    /** 动态参数，用于替换错误码模板中的 {0}、{1} 占位符 */
    private final Object[] args;

    /**
     * 静态错误码（无动态参数）
     *
     * @param messageCode 业务错误码
     */
    public BizException(MessageCode messageCode) {
        super(messageCode.getMessage());
        this.messageCode = messageCode;
        this.args = null;
    }

    /**
     * 带动态参数的错误码
     *
     * @param messageCode 业务错误码
     * @param args        动态参数，替换模板中的 {0}、{1} 等占位符
     */
    public BizException(MessageCode messageCode, Object... args) {
        super(messageCode.getMessage(args));
        this.messageCode = messageCode;
        this.args = args;
    }

    /**
     * 获取业务错误码
     *
     * @return MessageCode
     */
    public MessageCode getMessageCode() {
        return messageCode;
    }

    /**
     * 根据语言获取多语言错误文本（含动态参数替换）
     *
     * @param lang 语言标识（如 zh_CN、zh-CN、en_US；内部会规范为去分隔符大写键再查表）
     * @return 对应语言的错误文本
     */
    public String getMessage(String lang) {
        return messageCode.getMessage(lang, args);
    }
}
