package com.example.demo.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import com.example.demo.model.SystemSettings;
import com.example.demo.repository.SystemSettingsRepository;

import jakarta.annotation.PostConstruct;

/**
 * 动态API配置管理器
 * 优先从数据库加载配置，支持运行时更新，无需重启应用
 * 注意：视频生成和图片生成使用同一个 API Key
 */
@Component
public class DynamicApiConfig {

    private static final Logger logger = LoggerFactory.getLogger(DynamicApiConfig.class);

    @Autowired
    private SystemSettingsRepository systemSettingsRepository;

    // 从配置文件读取的默认值（作为兜底）
    @Value("${ai.api.key:}")
    private String defaultApiKey;

    @Value("${ai.api.base-url:https://ai.comfly.chat}")
    private String defaultApiBaseUrl;

    // 运行时配置（优先级最高，从数据库加载或动态更新）
    private volatile String runtimeApiKey = null;
    private volatile String runtimeApiBaseUrl = null;

    /**
     * 应用启动时从数据库加载配置
     */
    @PostConstruct
    public void loadFromDatabase() {
        try {
            SystemSettings settings = systemSettingsRepository.findById(1L).orElse(null);
            if (settings != null) {
                if (settings.getAiApiKey() != null && !settings.getAiApiKey().isEmpty()) {
                    this.runtimeApiKey = settings.getAiApiKey();
                    logger.info("✅ 从数据库加载 AI API Key: {}****", settings.getAiApiKey().substring(0, Math.min(4, settings.getAiApiKey().length())));
                }
                if (settings.getAiApiBaseUrl() != null && !settings.getAiApiBaseUrl().isEmpty()) {
                    this.runtimeApiBaseUrl = settings.getAiApiBaseUrl();
                    logger.info("✅ 从数据库加载 AI API Base URL: {}", settings.getAiApiBaseUrl());
                }
            }
            logger.info("API配置加载完成: apiKey={}, apiBaseUrl={}", maskApiKey(getApiKey()), getApiBaseUrl());
        } catch (Exception e) {
            logger.warn("从数据库加载API配置失败，使用配置文件默认值: {}", e.getMessage());
        }
    }

    /**
     * 获取当前有效的AI API密钥（视频和图片生成共用）
     * 优先级：运行时配置 > 配置文件默认值
     */
    public String getApiKey() {
        return runtimeApiKey != null ? runtimeApiKey : defaultApiKey;
    }

    /**
     * 获取当前有效的AI API基础URL
     */
    public String getApiBaseUrl() {
        return runtimeApiBaseUrl != null ? runtimeApiBaseUrl : defaultApiBaseUrl;
    }

    /**
     * 获取图片API密钥（与视频API共用同一个Key）
     */
    public String getImageApiKey() {
        return getApiKey();
    }

    /**
     * 获取图片API基础URL（与视频API共用同一个URL）
     */
    public String getImageApiBaseUrl() {
        return getApiBaseUrl();
    }

    /**
     * 动态更新API密钥（立即生效，无需重启）
     */
    public synchronized void updateApiKey(String newApiKey) {
        if (newApiKey != null && !newApiKey.trim().isEmpty()) {
            this.runtimeApiKey = newApiKey.trim();
            logger.info("✅ API密钥已动态更新，立即生效（无需重启）");
        }
    }

    /**
     * 动态更新API基础URL（立即生效，无需重启）
     */
    public synchronized void updateApiBaseUrl(String newBaseUrl) {
        if (newBaseUrl != null && !newBaseUrl.trim().isEmpty()) {
            this.runtimeApiBaseUrl = newBaseUrl.trim();
            logger.info("✅ API基础URL已动态更新，立即生效（无需重启）");
        }
    }

    /**
     * 动态更新图片API密钥（与视频API共用，调用 updateApiKey）
     */
    public synchronized void updateImageApiKey(String newApiKey) {
        updateApiKey(newApiKey);
    }

    /**
     * 动态更新图片API基础URL（与视频API共用，调用 updateApiBaseUrl）
     */
    public synchronized void updateImageApiBaseUrl(String newBaseUrl) {
        updateApiBaseUrl(newBaseUrl);
    }

    /**
     * 重置为配置文件的初始值
     */
    public synchronized void reset() {
        this.runtimeApiKey = null;
        this.runtimeApiBaseUrl = null;
        logger.info("⚠️ API配置已重置为配置文件的初始值");
    }

    /**
     * 获取配置状态信息
     */
    public java.util.Map<String, Object> getConfigStatus() {
        java.util.Map<String, Object> status = new java.util.HashMap<>();
        status.put("apiKey", maskApiKey(getApiKey()));
        status.put("apiBaseUrl", getApiBaseUrl());
        status.put("usingRuntimeConfig", runtimeApiKey != null || runtimeApiBaseUrl != null);
        return status;
    }

    /**
     * 掩码API密钥（只显示前4位和后4位）
     */
    private String maskApiKey(String apiKey) {
        if (apiKey == null || apiKey.length() <= 8) {
            return "****";
        }
        return apiKey.substring(0, 4) + "****" + apiKey.substring(apiKey.length() - 4);
    }
}
