package com.infoepoch.pms.agent.properties;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 单点登录配置属性。
 * <p>
 * 绑定 application.yml 中 pms.sso 前缀的配置。
 * </p>
 */
@Getter
@Setter
@ConfigurationProperties(prefix = "pms.sso")
public class SsoProperties {

    /** SSO Token Cookie 名称 */
    private String cookieName = "pms_agent_sso_token";
    /** 登录会话 Cookie 名称 */
    private String sessionCookieName = "pms_agent_session";
    /** Token 接收方标识 */
    private String audience = "pms-agent";
    /** Token 最大有效期（秒） */
    private long tokenExpireSeconds = 120;
    /** 时钟偏差容忍（秒） */
    private long clockSkewSeconds = 60;
    /** 登录会话有效期（秒） */
    private long sessionTtlSeconds = 7200;
    /** 是否使用 Secure Cookie */
    private boolean secureCookie = false;
    /** 信任的来源系统及其密钥 */
    private Map<String, TrustedIssuer> trustedIssuers = new LinkedHashMap<>();

    /**
     * 根据来源系统和密钥版本获取 AES 解密密钥。
     *
     * @param issuer 来源系统标识
     * @param kid    密钥版本标识
     * @return Base64 编码的 AES 密钥，不存在时返回 null
     */
    public String getAesKey(String issuer, String kid) {
        TrustedIssuer trustedIssuer = trustedIssuers.get(issuer);
        if (trustedIssuer == null) {
            return null;
        }
        return trustedIssuer.getKeys().get(kid);
    }

    /**
     * 信任的来源系统及其密钥配置。
     */
    @Getter
    @Setter
    public static class TrustedIssuer {
        /** 当前使用的密钥版本标识 */
        private String activeKid;
        /** 密钥版本到 Base64 编码的 AES 密钥的映射 */
        private Map<String, String> keys = new LinkedHashMap<>();
    }
}
