package com.infoepoch.pms.agent.platform.model.domain;

import com.infoepoch.pms.agent.platform.shared.exception.BusinessException;
import com.infoepoch.pms.agent.platform.shared.response.ResultCode;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.util.StringUtils;

import java.time.LocalDateTime;

/**
 * 系统设置实体。
 * <p>
 * 以键值对形式存储全局系统配置，如全局默认模型配置 ID。
 * 主键为配置项的 key 字符串，value 存储对应的值（文本）。
 * </p>
 */
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class SystemSettings {

    /**
     * 配置项键名最大长度。
     */
    private static final int KEY_MAX_LENGTH = 100;

    /**
     * 配置项键名，如 "default_model_config_id"。
     */
    private String key;

    /**
     * 配置项值，文本格式，可为 null 表示未设置。
     */
    private String value;

    /**
     * 记录最后更新时间。
     */
    private LocalDateTime updatedAt;

    /**
     * 仓储还原
     * @param key
     * @param value
     * @param updatedAt
     */
    public SystemSettings(String key, String value, LocalDateTime updatedAt) {
        this.key = key;
        this.value = value;
        this.updatedAt = updatedAt;
    }

    /**
     * 创建或覆盖系统设置项。
     *
     * @param key   配置项键名，不能为空，最长 100 字符
     * @param value 配置项值，可为 null
     */
    public SystemSettings(String key, String value) {
        if (!StringUtils.hasText(key)) {
            throw new BusinessException(ResultCode.PARAM_ERROR, "配置项键名不能为空");
        }
        String normalizedKey = key.trim();
        if (normalizedKey.length() > KEY_MAX_LENGTH) {
            throw new BusinessException(ResultCode.PARAM_ERROR,
                    "配置项键名长度不能超过 " + KEY_MAX_LENGTH + " 个字符");
        }
        this.key = normalizedKey;
        this.value = value;
        this.updatedAt = LocalDateTime.now();
    }

    /**
     * 更新配置项的值。
     *
     * @param value 新值，可为 null
     */
    public void modify(String value) {
        this.value = value;
        this.updatedAt = LocalDateTime.now();
    }

    public static SystemSettings restore(String key, String value, LocalDateTime updatedAt) {
        SystemSettings settings = new SystemSettings();
        settings.key = key;
        settings.value = value;
        settings.updatedAt = updatedAt;
        return settings;
    }
}
