package org.xyzh.api.system.config;

import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.core.page.PageParam;
import org.xyzh.common.dto.system.TbSysConfig;

import java.util.List;
import java.util.Map;

/**
 * @description 系统配置服务
 * @filename SysConfigService.java
 * @author AI Assistant
 * @copyright xyzh
 * @since 2025-11-04
 */
public interface SysConfigService {

    // ==================== 配置读取接口（业务代码使用） ====================
    
    Object getSysConfig(String key);

    /**
     * 获取字符串类型配置
     * @param key 配置键
     * @return 配置值
     */
    String getStringConfig(String key);
    
    /**
     * 获取整数类型配置
     * @param key 配置键
     * @return 配置值，如果不存在或解析失败返回null
     */
    Integer getIntConfig(String key);
    
    /**
     * 获取布尔类型配置
     * @param key 配置键
     * @return 配置值，如果不存在或解析失败返回null
     */
    Boolean getBooleanConfig(String key);
    
    /**
     * 获取浮点数类型配置
     * @param key 配置键
     * @return 配置值，如果不存在或解析失败返回null
     */
    Double getDoubleConfig(String key);
    
    /**
     * 获取长整数类型配置
     * @param key 配置键
     * @return 配置值，如果不存在或解析失败返回null
     */
    Long getLongConfig(String key);
    
    // ==================== 配置管理接口（管理界面使用） ====================
    
    /**
     * 获取所有配置项
     * @return 配置项列表
     */
    ResultDomain<TbSysConfig> getAllConfigs();
    
    /**
     * 根据分组获取配置项
     * @param groupKey 分组键
     * @return 配置项列表
     */
    ResultDomain<TbSysConfig> getConfigsByGroup(String groupKey);
    
    /**
     * 批量保存配置项（仅更新值）
     * @param configs 配置项列表
     * @return 保存结果
     */
    ResultDomain<Boolean> batchSaveConfigs(List<Map<String, String>> configs);
    
    /**
     * 创建配置项
     * @param config 配置项
     * @return 创建结果
     */
    ResultDomain<Boolean> createConfig(TbSysConfig config);
    
    /**
     * 更新配置项
     * @param config 配置项
     * @return 更新结果
     */
    ResultDomain<Boolean> updateConfig(TbSysConfig config);
    
    /**
     * 删除配置项
     * @param id 配置ID
     * @return 删除结果
     */
    ResultDomain<Boolean> deleteConfig(String id);
    
    /**
     * 分页查询配置项
     * @param filter 查询条件
     * @param pageParam 分页参数
     * @return 配置项分页列表
     */
    ResultDomain<TbSysConfig> getConfigPage(TbSysConfig filter, PageParam pageParam);
    
    /**
     * 根据ID获取配置项
     * @param id 配置ID
     * @return 配置项详情
     */
    ResultDomain<TbSysConfig> getConfigById(String id);
}
