package com.njcn.rdms.module.system.service.user;

import cn.hutool.core.map.MapUtil;
import com.njcn.rdms.module.system.dal.dataobject.user.UserPreferenceDO;
import com.njcn.rdms.module.system.dal.mysql.user.UserPreferenceMapper;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 用户偏好配置 Service 实现类
 */
@Service
@Validated
@Slf4j
public class UserPreferenceServiceImpl implements UserPreferenceService {

    @Resource
    private UserPreferenceMapper userPreferenceMapper;

    @Override
    public Map<String, Object> getThemeSettings(Long userId) {
        UserPreferenceDO preference = userPreferenceMapper.selectByUserId(userId);
        if (preference == null || MapUtil.isEmpty(preference.getThemeSettingsJson())) {
            // 对外固定返回 {}，避免前端再区分 null 与空对象两套分支。
            return new LinkedHashMap<>();
        }
        // 返回副本，避免上层误改持久化对象里的 Map 引用。
        return new LinkedHashMap<>(preference.getThemeSettingsJson());
    }

    @Override
    public void saveThemeSettings(Long userId, Map<String, Object> themeSettings) {
        UserPreferenceDO preference = userPreferenceMapper.selectByUserId(userId);
        if (MapUtil.isEmpty(themeSettings)) {
            // 空对象等价于“没有个性化覆盖项”，直接复用重置语义，避免数据库残留无意义的 {}。
            if (preference != null) {
                userPreferenceMapper.updateThemeSettingsByUserId(userId, null);
            }
            return;
        }

        // 保存副本而不是直接持有入参引用，避免后续调用链继续改动同一 Map。
        Map<String, Object> themeSettingsCopy = new LinkedHashMap<>(themeSettings);
        if (preference == null) {
            // 当前用户还没有偏好记录时创建首条数据，依赖 user_id 唯一约束保证一人一份。
            userPreferenceMapper.insert(UserPreferenceDO.builder()
                    .userId(userId)
                    .themeSettingsJson(themeSettingsCopy)
                    .build());
            return;
        }

        // 当前用户已有记录时仅更新主题覆盖项 JSON，不改动归属 userId。
        userPreferenceMapper.updateThemeSettingsByUserId(userId, themeSettingsCopy);
    }

    @Override
    public void resetThemeSettings(Long userId) {
        // 不直接做逻辑删除，避免 user_id 唯一键与逻辑删除组合后影响后续再次保存。
        userPreferenceMapper.updateThemeSettingsByUserId(userId, null);
    }

}
