package com.example.demo.service;

import com.example.demo.model.Config;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.Collectors;

/**
 * 参数配置服务。
 * <p>基于内存数据存储，提供系统参数的新增、编辑、查询。</p>
 */
@Service
public class ConfigService {

    private final Map<Long, Config> configStore = new ConcurrentHashMap<>();
    private final AtomicLong idGenerator = new AtomicLong(1);

    public ConfigService() {
        initMockData();
    }

    private void initMockData() {
        save(new Config(1L, "系统名称", "system.name", "综合管理平台", "系统显示名称", 1));
        save(new Config(2L, "系统版本", "system.version", "1.0.0", "当前版本号", 1));
        save(new Config(3L, "页面大小", "page.size", "20", "默认分页大小", 1));
        idGenerator.set(4);
    }

    /**
     * 新增参数配置。
     *
     * @requirement(name="参数配置", id="SRS-F-01-005")
     * @param config 参数配置信息
     * @return 已保存的参数
     */
    public Config save(Config config) {
        if (config.getConfigId() == null) {
            config.setConfigId(idGenerator.getAndIncrement());
        }
        if (config.getStatus() == null) {
            config.setStatus(1);
        }
        configStore.put(config.getConfigId(), config);
        return config;
    }

    /**
     * 编辑参数配置。
     *
     * @requirement(name="参数配置", id="SRS-F-01-005")
     * @param config 包含更新信息的参数
     * @return 更新后的参数，若ID不存在返回 null
     */
    public Config update(Config config) {
        Config existing = configStore.get(config.getConfigId());
        if (existing == null) return null;
        if (config.getConfigName() != null) existing.setConfigName(config.getConfigName());
        if (config.getConfigKey() != null) existing.setConfigKey(config.getConfigKey());
        if (config.getConfigValue() != null) existing.setConfigValue(config.getConfigValue());
        if (config.getRemark() != null) existing.setRemark(config.getRemark());
        if (config.getStatus() != null) existing.setStatus(config.getStatus());
        return existing;
    }

    /**
     * 查询参数列表，支持按参数名称筛选。
     *
     * @requirement(name="参数配置", id="SRS-F-01-005")
     * @param configName 参数名称（可选，模糊匹配）
     * @return 参数列表
     */
    public List<Config> list(String configName) {
        return configStore.values().stream()
                .filter(c -> configName == null || c.getConfigName().contains(configName))
                .collect(Collectors.toList());
    }

    /**
     * 根据ID查询参数详情。
     *
     * @requirement(name="参数配置", id="SRS-F-01-005")
     * @param configId 参数ID
     * @return 参数对象
     */
    public Config findById(Long configId) {
        return configStore.get(configId);
    }
}
