package com.ssyf.third.bmiss.core;

import lombok.Data;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 配置管理类
 * 管理第三方请求的配置信息，包括加密开关、重试策略和超时设置
 * 通过Spring Boot配置自动注入，与Python代码保持一致
 * 
 * @author system
 * @since 1.0
 */
@Slf4j
@Data
@Accessors(chain = true)
@Component
@ConfigurationProperties(prefix = "bmiss.third-party")
public class ConfigManager {
    
    /** 是否启用加密 */
    private boolean encryption_enabled = true;
    
    /** 加密密钥 */
    private String secret_key = "default-secret-key";
    
    /** 请求超时时间（毫秒） */
    private int timeout = 10000;
    
    /** 重试次数 */
    private int retry_count = 3;
    
    /** 重试间隔（毫秒） */
    private int retry_interval = 500;
    
    /** 钉钉机器人配置 */
    private DingtalkConfig dingtalk = new DingtalkConfig();
    
    /** 业务API配置 */
    private BusinessConfig business = new BusinessConfig();
    
    /** 日志配置 */
    private LoggingConfig logging = new LoggingConfig();
    
    /** 加密配置 */
    private EncryptionConfig encryption = new EncryptionConfig();
    
    /** 请求配置 */
    private RequestConfig request = new RequestConfig();
    
    /**
     * 初始化配置（Spring会自动注入配置）
     */
    public void init() {
        log.debug("配置管理器初始化完成: {}", getConfigSummary());
    }
    
    /**
     * 获取重试次数
     * 
     * @return 重试次数
     */
    public int getRetryCount() {
        return request.getRetry() != null ? request.getRetry().getMaxAttempts() : retry_count;
    }
    
    /**
     * 获取重试间隔
     * 
     * @return 重试间隔（毫秒）
     */
    public int getRetryInterval() {
        return retry_interval;
    }
    
    /**
     * 是否启用加密
     * 
     * @return 是否启用加密
     */
    public boolean isEncryptionEnabled() {
        return encryption.isEnabled();
    }
    
    /**
     * 验证配置是否有效
     * 
     * @return 配置是否有效
     */
    public boolean isValid() {
        if (isEncryptionEnabled() && (getSecretKey() == null || getSecretKey().length() < 16)) {
            log.warn("加密已启用但密钥长度不足16位");
            return false;
        }
        
        if (timeout <= 0) {
            log.warn("超时时间必须大于0");
            return false;
        }
        
        if (getRetryCount() < 0) {
            log.warn("重试次数不能为负数");
            return false;
        }
        
        return true;
    }
    
    /**
     * 获取加密密钥
     * 
     * @return 加密密钥
     */
    public String getSecretKey() {
        return encryption.getDefaultKey() != null ? encryption.getDefaultKey() : secret_key;
    }
    
    /**
     * 获取默认密钥名称（对齐Python代码的默认密钥逻辑）
     * 
     * @return 默认密钥名称
     */
    public String getDefaultSecretKey() {
        return encryption.getDefaultKey() != null ? encryption.getDefaultKey() : secret_key;
    }
    
    /**
     * 获取默认密钥配置
     * 
     * @return 默认密钥配置
     */
    public SecretConfig getDefaultSecretConfig() {
        return encryption.getDefaultSecret();
    }
    
    /**
     * 根据密钥名称获取密钥配置
     * 
     * @param name 密钥名称
     * @return 密钥配置，如果不存在则返回null
     */
    public SecretConfig getSecretConfigByName(String name) {
        return encryption.getSecretByName(name);
    }
    
    /**
     * 是否启用请求加密
     * 
     * @return 是否启用请求加密
     */
    public boolean isRequestEncryptionEnabled() {
        return encryption.isEnableRequestEncryption();
    }
    
    /**
     * 是否启用响应解密
     * 
     * @return 是否启用响应解密
     */
    public boolean isResponseDecryptionEnabled() {
        return encryption.isEnableResponseDecryption();
    }
    
    /**
     * 获取所有可用的密钥名称列表
     * 
     * @return 密钥名称列表
     */
    public List<String> getAvailableSecretNames() {
        if (encryption.getSecrets() == null) {
            return new ArrayList<>();
        }
        return encryption.getSecrets().stream()
            .map(SecretConfig::getName)
            .collect(Collectors.toList());
    }
    
    /**
     * 获取配置信息摘要
     * 
     * @return 配置摘要
     */
    public String getConfigSummary() {
        return String.format(
            "ConfigManager[encryptionEnabled=%s, timeout=%d, retryCount=%d, loggingEnabled=%s]",
            isEncryptionEnabled(), timeout, getRetryCount(), logging.isEnabled()
        );
    }
    
    /**
     * 验证钉钉配置是否完整
     * 
     * @return 钉钉配置是否完整
     */
    public boolean isDingtalkConfigValid() {
        return dingtalk.isEnabled() && dingtalk.getWebhookUrl() != null;
    }
    
    /**
     * 验证业务API配置是否完整
     * 
     * @return 业务API配置是否完整
     */
    public boolean isBusinessApiConfigValid() {
        return business.isEnabled() && business.getBaseUrl() != null;
    }
}













