/*
 * Copyright (c) 杭州颉创科技有限公司 2025. All rights reserved.
 * This source file is licensed under the MIT License found in the
 * LICENSE file in the root directory of this source tree.
 */

package simcu::simapi.openapi

import std.io.*
import std.reflect.*
import stdx.encoding.json.stream.*
import simcu::simapi.openapi.models.*

/**
 * @brief 响应类型元数据（供动态注册的路由指定返回类型）。
 */
public class ApiResponseTypeMetadata {
    /**
     * @brief 响应类型的类型信息。
     */
    public let responseType: ?TypeInfo
    /**
     * @brief 创建响应类型元数据实例。
     * @param responseType 响应类型的类型信息。
     */
    public init(responseType: ?TypeInfo) {
        this.responseType = responseType
    }
}

/**
 * @brief 提供基于 JSON 的 OpenAPI 写入器实现。
 */
public class JsonOpenApiWriter <: IOpenApiWriter {
    private let _writer: JsonWriter

    /**
     * @brief 创建 JSON OpenAPI 写入器实例。
     * @param stream 输出流。
     */
    public init(stream: OutputStream) {
        _writer = JsonWriter(stream)
    }

    /**
     * @brief 开始写入对象。
     */
    public func startObject(): Unit {
        _writer.startObject()
    }

    /**
     * @brief 结束写入对象。
     */
    public func endObject(): Unit {
        _writer.endObject()
    }

    /**
     * @brief 开始写入数组。
     */
    public func startArray(): Unit {
        _writer.startArray()
    }

    /**
     * @brief 结束写入数组。
     */
    public func endArray(): Unit {
        _writer.endArray()
    }

    /**
     * @brief 写入属性名称。
     * @param name 要写入的属性名称。
     */
    public func writeName(name: String): Unit {
        _writer.writeName(name)
    }

    /**
     * @brief 写入字符串值。
     * @param value 要写入的字符串值。
     */
    public func writeValue(value: String): Unit {
        _writer.writeValue(value)
    }

    /**
     * @brief 写入整数值。
     * @param value 要写入的整数值。
     */
    public func writeValue(value: Int64): Unit {
        _writer.writeValue(value)
    }

    /**
     * @brief 写入布尔值。
     * @param value 要写入的布尔值。
     */
    public func writeValue(value: Bool): Unit {
        _writer.writeValue(value)
    }

    /**
     * @brief 刷新当前写入器。
     */
    public func flush(): Unit {
        _writer.flush()
    }
}

/**
 * @brief 表示带名称的服务标识。
 */
public class NamedService {
    /**
     * @brief 表示服务名称。
     */
    public let name: String

    /**
     * @brief 创建带名称的服务标识实例。
     * @param name 服务名称。
     */
    public init(name: String) {
        this.name = name
    }
}

/*
Option类型操作
 */
protected class Nullable {
    /**
     * @brief 返回 Option 类型的底层类型。
     * @param typeInfo 要解析的类型信息。
     * @return 如果是 Option 类型则返回其底层类型，否则返回 `None`。
     */
    public static func getUnderlyingType(typeInfo: TypeInfo): ?TypeInfo {
        let qualifiedName = typeInfo.qualifiedName
        if (!(qualifiedName.startsWith("Option<") && qualifiedName.endsWith('>'))) {
            return None
        }
        let underlyingTypeName = qualifiedName[7..qualifiedName.size - 1]
        return TypeInfo.get(underlyingTypeName)
    }
}
