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

package simcu::simapi.configurations

import std.collection.*

/**
 * 文档组配置。
 */
public class SimApiDocGroup {
    public var id: String = ""
    public var name: String = ""
    public var description: String = ""

    /**
     * 是否为默认文档组。
     * 未标注 @SimApiDoc[groupName] 的接口仅进入默认组文档；
     * 若所有组均未标记，则第一个组视为默认组。
     */
    public var isDefault: Bool = false

    public init() {}

    public init(id: String, name!: String = "", description!: String = "", isDefault!: Bool = false) {
        this.id = id
        this.name = if (name.isEmpty()) { id } else { name }
        this.description = description
        this.isDefault = isDefault
    }
}

/**
 * 文档授权配置。
 * Type 支持 "SimApiAuth"、"ClientCredentials"、"Implicit"、"AuthorizationCode"、"Password"。
 */
public class SimApiAuthOption {
    /**
     * 认证方式（默认 ["SimApiAuth"]）。
     * `type` 是仓颉关键字，用反引号转义保留属性名。
     */
    public var `type`: Array<String> = ["SimApiAuth"]

    /**
     * 认证描述（默认 "认证服务器颁发的AccessToken"）。
     */
    public var description: String = "认证服务器颁发的AccessToken"

    /**
     * 授权地址。
     */
    public var authorizationUrl: String = ""

    /**
     * Token 地址。
     */
    public var tokenUrl: String = ""

    /**
     * 授权范围。
     */
    public var scopes: HashMap<String, String> = HashMap<String, String>()
}

/**
 * 文档相关配置（默认值）。
 */
public class SimApiDocOptions {
    /**
     * 文档组配置（默认 [new("api", "Api", "Api接口文档")]）。
     */
    public var apiGroups: ArrayList<SimApiDocGroup> = ArrayList<SimApiDocGroup>()

    /**
     * 授权配置（默认 SimApiAuthOption()）。
     */
    public var apiAuth: SimApiAuthOption = SimApiAuthOption()

    /**
     * 文档页面标题（默认 "API接口文档"）。
     */
    public var documentTitle: String = "API接口文档"

    /**
     * 文档路由前缀（默认 "docs"）。
     * Swagger UI 静态资源挂载在 /{urlPrefix}/ 下，文档 JSON 挂载在 /{urlPrefix}/{id}.json。
     */
    public var urlPrefix: String = "docs"

    /**
     * 接口支持的调用方式（默认仅 POST）。
     */
    public var supportedMethods: Array<String> = ["POST"]

    public init() {
        apiGroups.add(SimApiDocGroup("api"))
    }

    /**
     * 返回按 id 去重后的文档组（保留最后出现的组，用户配置覆盖默认值）。
     * 按首次出现的顺序排列，但每个 id 取最后出现的定义。
     */
    public func distinctGroups(): ArrayList<SimApiDocGroup> {
        let order = ArrayList<String>()
        let latest = HashMap<String, SimApiDocGroup>()
        for (g in apiGroups) {
            if (!latest.contains(g.id)) {
                order.add(g.id)
            }
            latest[g.id] = g
        }
        let result = ArrayList<SimApiDocGroup>()
        for (id in order) {
            if (let Some(g) <- latest.get(id)) {
                result.add(g)
            }
        }
        return result
    }
}
