package com.example.demo.service;

import com.example.demo.model.SystemConfig;
import jakarta.annotation.PostConstruct;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;

/**
 * 系统参数配置管理服务。
 * 使用内存假数据实现系统参数配置的维护功能。
 */
@Service
public class SystemConfigService {

    /** 内存数据存储 */
    private final Map<Long, SystemConfig> configMap = new ConcurrentHashMap<>();

    private final AtomicLong idGenerator = new AtomicLong(400);

    /**
     * 新增参数配置。
     *
     * @requirement(name="参数配置", id="SRS-IMS_F-005")
     *
     * @param config 参数配置信息
     * @return 创建后的配置
     */
    public SystemConfig createConfig(SystemConfig config) {
        long id = idGenerator.incrementAndGet();
        config.setId(id);
        config.setCreateTime(LocalDateTime.now());
        config.setUpdateTime(LocalDateTime.now());
        if (config.getStatus() == null) {
            config.setStatus(1);
        }
        configMap.put(id, config);
        return config;
    }

    /**
     * 编辑参数配置。
     *
     * @requirement(name="参数配置", id="SRS-IMS_F-005")
     *
     * @param id     配置ID
     * @param config 更新后的配置信息
     * @return 更新后的配置
     */
    public SystemConfig updateConfig(Long id, SystemConfig config) {
        SystemConfig existing = configMap.get(id);
        if (existing == null) {
            throw new IllegalArgumentException("参数配置不存在，ID: " + id);
        }
        if (config.getConfigKey() != null) {
            existing.setConfigKey(config.getConfigKey());
        }
        if (config.getConfigValue() != null) {
            existing.setConfigValue(config.getConfigValue());
        }
        if (config.getDescription() != null) {
            existing.setDescription(config.getDescription());
        }
        if (config.getStatus() != null) {
            existing.setStatus(config.getStatus());
        }
        existing.setUpdateTime(LocalDateTime.now());
        configMap.put(id, existing);
        return existing;
    }

    /**
     * 删除参数配置。
     *
     * @requirement(name="参数配置", id="SRS-IMS_F-005")
     *
     * @param id 配置ID
     */
    public void deleteConfig(Long id) {
        if (!configMap.containsKey(id)) {
            throw new IllegalArgumentException("参数配置不存在，ID: " + id);
        }
        configMap.remove(id);
    }

    /**
     * 查询所有参数配置列表。
     *
     * @requirement(name="参数配置", id="SRS-IMS_F-005")
     *
     * @return 参数配置列表
     */
    public List<SystemConfig> listConfigs() {
        return new ArrayList<>(configMap.values());
    }

    /**
     * 根据ID获取参数配置。
     *
     * @param id 配置ID
     * @return 配置信息
     */
    public SystemConfig getConfig(Long id) {
        SystemConfig config = configMap.get(id);
        if (config == null) {
            throw new IllegalArgumentException("参数配置不存在，ID: " + id);
        }
        return config;
    }

    /**
     * 初始化默认参数配置。
     */
    @PostConstruct
    public void initDefaultConfigs() {
        if (configMap.isEmpty()) {
            configMap.put(1L, new SystemConfig(1L, "system.title", "信息管理系统", "系统标题", 1));
            configMap.put(2L, new SystemConfig(2L, "system.version", "1.0.0", "系统版本", 1));
            configMap.put(3L, new SystemConfig(3L, "system.logo", "/images/logo.png", "系统Logo路径", 1));
            configMap.put(4L, new SystemConfig(4L, "pagination.defaultSize", "20", "默认每页条数", 1));
            configMap.put(5L, new SystemConfig(5L, "security.password.minLength", "6", "密码最小长度", 1));
            configMap.put(6L, new SystemConfig(6L, "security.jwt.expiration", "86400000", "JWT过期时间（毫秒）", 1));

            configMap.values().forEach(c -> {
                c.setCreateTime(LocalDateTime.now());
                c.setUpdateTime(LocalDateTime.now());
            });
        }
    }
}
