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

package simcu::simapi.openapi

import std.reflect.*
import soulsoft_web_http.*
import simcu::simapi.annotations.*
import simcu::simapi.openapi.metadata.*

/**
 * @brief 响应类型元数据实现。
 */
public class ApiResponseTypeMetadata <: IApiResponseTypeMetadata {
    private let _responseType: ?TypeInfo
    public init(responseType: ?TypeInfo) {
        _responseType = responseType
    }
    public prop responseType: ?TypeInfo {
        get() {
            _responseType
        }
    }
}

/**
 * @brief 为动态注册的路由提供认证和响应类型元数据扩展。
 */
public interface SimApiEndpointMetadataExtensions {
    func withSimApiAuth(auth: SimApiAuth): EndpointConventionBuilder
    func withResponseType(typeInfo: TypeInfo): EndpointConventionBuilder
}

extend EndpointConventionBuilder <: SimApiEndpointMetadataExtensions {
    /**
     * @brief 为端点附加 SimApiAuth 认证元数据（使 OpenAPI 文档显示锁图标）。
     */
    public func withSimApiAuth(auth: SimApiAuth): EndpointConventionBuilder {
        this.add {
            builder => builder.metadata.add(auth)
        }
        return this
    }

    /**
     * @brief 为端点附加响应类型元数据（使动态路由也能生成 response schema）。
     */
    public func withResponseType(typeInfo: TypeInfo): EndpointConventionBuilder {
        this.add {
            builder => builder.metadata.add(ApiResponseTypeMetadata(Some(typeInfo)))
        }
        return this
    }
}