/*
 * Copyright (c) 2025 SimcuTeam. All rights reserved.
 * 遵循 MIT 许可证。
 */

package simcu::simapi.communications

import std.collection.*

/**
 * 基础响应体：所有接口统一返回该结构。
 * HTTP 状态码始终 200，业务错误通过 code 字段表达。
 * 序列化/反序列化由 simapi_serialization 反射处理（无需接口/宏）。
 */
public class SimApiBaseResponse {
    public var code: Int64 = 200
    public var message: String = "成功"

    public init(code: Int64, message: String) {
        this.code = code
        this.message = message
    }

    public init(code: Int64) {
        this.code = code
        this.message = getDefaultMessage(code)
    }

    public init() {
        this.code = 200
        this.message = "成功"
    }

    /**
     * 默认错误代码对应提示信息。
     */
    public static func getDefaultMessage(code: Int64): String {
        match (code) {
            case 200 => "成功"
            case 204 => "没有数据"
            case 400 => "参数错误"
            case 401 => "需要登录"
            case 403 => "无权访问"
            case 404 => "请求资源不存在"
            case 500 => "服务器错误"
            case _ => "未知错误代码"
        }
    }
}

/**
 * 分页内容返回。
 * @param T 列表元素类型。
 * 说明：泛型类暂不通过反射序列化，可手动转换为 SimApiResponse。
 */
public class PageResponse<T> {
    public var list: Array<T> = Array<T>()
    public var page: Int64 = 1
    public var count: Int64 = 20
    public var total: Int64 = 0

    public init() {}

    public init(list: Array<T>, page: Int64, count: Int64, total: Int64) {
        this.list = list
        this.page = page
        this.count = count
        this.total = total
    }
}

/**
 * 带数据的动态响应。
 * @param T 数据类型。
 * 序列化/反序列化由 simapi_serialization 反射处理：
 *   - code/message/data 为普通字段，反射递归
 *   - data 支持任意 T（免约束）
 * 注：泛型嵌套（SimApiResponse<T>）的反射反序列化已验证可用。
 */
public class SimApiResponse<T> {
    public var code: Int64 = 200
    public var message: String = "成功"
    public var data: ?T = None

    public init() {}

    public init(data: T) {
        this.data = Some(data)
    }

    public init(code: Int64, message: String) {
        this.code = code
        this.message = message
    }

    public init(code: Int64, message: String, data: T) {
        this.code = code
        this.message = message
        this.data = Some(data)
    }
}
