/*
 * Copyright (c) 2025 SimcuTeam. All rights reserved.
 * 遵循 MIT 许可证。
 *
 * 错误抛出：提供「顶层函数」+「SimApiError 类」两种写法。
 *  - 顶层函数：import simcu::simapi.helpers.* 后可直接 error(400) / errorWhen(...)，无需前缀
 *  - SimApiError.error(...)：旧写法，保留兼容
 */

package simcu::simapi.helpers

import simcu::simapi.exceptions.*

// ===== 顶层函数（推荐用法：直接 error(400)） =====

/**
 * 直接抛错。
 * @param code 错误代码，默认 500。
 * @param message 错误描述，默认空（由 code 自动带取描述）。
 */
public func error(code!: Int64 = 500, message!: String = ""): Unit {
    SimApiError.error(code: code, message: message)
}

/**
 * 条件为 true 时抛错。
 * @param condition 检测条件。
 * @param code 错误代码，默认 400。
 * @param message 错误描述。
 */
public func errorWhen(condition: Bool, code!: Int64 = 400, message!: String = ""): Unit {
    SimApiError.errorWhen(condition, code: code, message: message)
}

/**
 * 条件为 true 时抛错（别名）。
 */
public func errorWhenTrue(condition: Bool, code!: Int64 = 400, message!: String = ""): Unit {
    SimApiError.errorWhenTrue(condition, code: code, message: message)
}

/**
 * 条件为 false 时抛错。
 */
public func errorWhenFalse(condition: Bool, code!: Int64 = 400, message!: String = ""): Unit {
    SimApiError.errorWhenFalse(condition, code: code, message: message)
}

/**
 * 给定的可选值：None 时抛错,否则返回解包后的值。
 */
public func errorWhenNone<T>(value: ?T, code!: Int64 = 404, message!: String = ""): T {
    SimApiError.errorWhenNone(value, code: code, message: message)
}

// ===== 兼容门面（旧写法 SimApiError.error(...) 仍可用，内部为真实实现） =====

/**
 * 错误抛出辅助类：所有业务错误统一通过这里抛出 SimApiException。
 */
public class SimApiError {
    private init() {}

    /**
     * 直接抛错。
     * @param code 错误代码，默认 500。
     * @param message 错误描述，默认空（由 code 自动带取描述）。
     */
    public static func error(code!: Int64 = 500, message!: String = ""): Unit {
        throw SimApiException(code, message: message)
    }

    /**
     * 条件为 true 时抛错。
     * @param condition 检测条件。
     * @param code 错误代码，默认 400。
     * @param message 错误描述。
     */
    public static func errorWhen(condition: Bool, code!: Int64 = 400, message!: String = ""): Unit {
        if (condition) {
            error(code: code, message: message)
        }
    }

    /**
     * 条件为 true 时抛错（别名）。
     */
    public static func errorWhenTrue(condition: Bool, code!: Int64 = 400, message!: String = ""): Unit {
        errorWhen(condition, code: code, message: message)
    }

    /**
     * 条件为 false 时抛错。
     */
    public static func errorWhenFalse(condition: Bool, code!: Int64 = 400, message!: String = ""): Unit {
        errorWhen(!condition, code: code, message: message)
    }

    /**
     * 给定的可选值：None 时抛错,否则返回解包后的值。
     */
    public static func errorWhenNone<T>(value: ?T, code!: Int64 = 404, message!: String = ""): T {
        match (value) {
            case Some(v) => v
            case None => throw SimApiException(code, message: message)
        }
    }
}
