package com.gameplatform.server.service.admin;

import com.gameplatform.server.mapper.admin.SystemConfigMapper;
import com.gameplatform.server.model.entity.admin.SystemConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class SystemConfigService {
    
    @Autowired
    private SystemConfigMapper systemConfigMapper;
    
    public SystemConfig getConfigByKey(String configKey) {
        return systemConfigMapper.findByKey(configKey);
    }
    
    public String getConfigValue(String configKey, String defaultValue) {
        SystemConfig config = systemConfigMapper.findByKey(configKey);
        return config != null ? config.getConfigValue() : defaultValue;
    }
    
    public Integer getConfigValueAsInt(String configKey, Integer defaultValue) {
        String value = getConfigValue(configKey, null);
        if (value == null) return defaultValue;
        try {
            return Integer.parseInt(value);
        } catch (NumberFormatException e) {
            return defaultValue;
        }
    }
    
    public Boolean getConfigValueAsBoolean(String configKey, Boolean defaultValue) {
        String value = getConfigValue(configKey, null);
        if (value == null) return defaultValue;
        return Boolean.parseBoolean(value);
    }
    
    public List<SystemConfig> getAllConfigs(int size, int offset) {
        return systemConfigMapper.findAll(size, offset);
    }
    
    public long getConfigCount() {
        return systemConfigMapper.countAll();
    }
    
    public List<SystemConfig> getConfigsByType(String configType) {
        return systemConfigMapper.findByType(configType);
    }
    
    public boolean createConfig(SystemConfig systemConfig) {
        return systemConfigMapper.insert(systemConfig) > 0;
    }
    
    public boolean updateConfig(SystemConfig systemConfig) {
        return systemConfigMapper.update(systemConfig) > 0;
    }
    
    public boolean deleteConfig(Long id) {
        return systemConfigMapper.deleteById(id) > 0;
    }
    
    public boolean deleteConfigByKey(String configKey) {
        return systemConfigMapper.deleteByKey(configKey) > 0;
    }
    
    // 获取链接相关的默认配置
    public Integer getDefaultQuantity() {
        return getConfigValueAsInt("link.default_quantity", 50);
    }
    
    public Integer getRefreshInterval() {
        return getConfigValueAsInt("link.refresh_interval", 300);
    }
    
    public Integer getQrExpireTime() {
        return getConfigValueAsInt("link.qr_expire_time", 600);
    }
    

    

    
    public String getScriptServerUrl() {
        return getConfigValue("script.server_url", "http://36.138.184.60:12345");
    }
    
    public String getQrPathTemplate() {
        return getConfigValue("script.qr_path_template", "/{machineId}/二维码.png");
    }
    
    // 获取用户端相关配置
    public Integer getUserQrExpireSeconds() {
        return getConfigValueAsInt("user.qr_expire_seconds", 60);
    }
    
    public Integer getUserRefreshWaitSeconds() {
        return getConfigValueAsInt("user.refresh_wait_seconds", 10);
    }
    
    public Integer getUserLinkExpireHours() {
        return getConfigValueAsInt("user.link_expire_hours", 24);
    }
    
    public String getUserAssetsBaseUrl() {
        return getConfigValue("user.assets_base_url", "http://36.138.184.60:12345");
    }
    
    // 获取设备检测相关配置
    public String getDeviceIdleStatus() {
        return getConfigValue("device.idle_status", "空的");
    }
    
    // 获取首次选区后链接过期时间（秒）
    public Integer getFirstRegionExpireSeconds() {
        return getConfigValueAsInt("link.first_region_expire", 600);
    }
    
    // 获取用户进度显示格式（percent 或 ratio）
    public String getProgressDisplayFormat() {
        return getConfigValue("user.progress_display_format", "percent");
    }
    
    // 批量更新配置
    public boolean updateConfigs(List<SystemConfig> configs) {
        if (configs == null || configs.isEmpty()) {
            return false;
        }
        
        int successCount = 0;
        for (SystemConfig config : configs) {
            if (config.getId() != null) {
                if (systemConfigMapper.update(config) > 0) {
                    successCount++;
                }
            } else if (config.getConfigKey() != null) {
                // 根据key更新
                SystemConfig existing = systemConfigMapper.findByKey(config.getConfigKey());
                if (existing != null) {
                    config.setId(existing.getId());
                    config.setIsSystem(existing.getIsSystem()); // 保留原有的 isSystem 值
                    if (systemConfigMapper.update(config) > 0) {
                        successCount++;
                    }
                }
            }
        }
        
        return successCount > 0;
    }
    
    // 根据key批量更新配置值
    public boolean updateConfigValueByKey(String configKey, String configValue) {
        SystemConfig config = systemConfigMapper.findByKey(configKey);
        if (config == null) {
            return false;
        }
        config.setConfigValue(configValue);
        return systemConfigMapper.update(config) > 0;
    }
    
    // 验证配置值的格式是否正确
    public boolean validateConfigValue(String configType, String configValue) {
        if (configValue == null || configValue.trim().isEmpty()) {
            return false;
        }
        
        try {
            switch (configType.toUpperCase()) {
                case "INTEGER":
                    Integer.parseInt(configValue);
                    return true;
                case "BOOLEAN":
                    String lowerValue = configValue.toLowerCase();
                    return "true".equals(lowerValue) || "false".equals(lowerValue);
                case "JSON":
                    // 简单的JSON格式验证
                    String trimmed = configValue.trim();
                    return (trimmed.startsWith("{") && trimmed.endsWith("}")) ||
                           (trimmed.startsWith("[") && trimmed.endsWith("]"));
                case "STRING":
                default:
                    return true;
            }
        } catch (NumberFormatException e) {
            return false;
        }
    }
}
