package com.ghy.system.service.impl;

import com.ghy.common.exception.ServiceException;
import com.ghy.common.utils.DateUtils;
import com.ghy.common.utils.ObjectUtils;
import com.ghy.system.domain.SysGlobalConfig;
import com.ghy.system.mapper.SysGlobalConfigMapper;
import com.ghy.system.service.ISysGlobalConfigService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.Objects;

/**
 * @Date: 2024-09-21 23:36
 * @Author: 但星霖
 * @Version: v1.0
 * @Description: 系统配置表业务接口层实现类
 */
@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class SysGlobalConfigServiceImpl implements ISysGlobalConfigService {

    private final SysGlobalConfigMapper mapper;

    @Override
    public Boolean create(SysGlobalConfig sysConfig) {
        log.info("{}收到系统配置清数据新增，新增内容：{}", DateUtils.timeFormat(new Date()), sysConfig);
        if (!vailName(sysConfig.getName(), null)) {
            log.error("系统配置项：{}新增失败，系统配置项名称重复。", sysConfig.getName());
            throw new ServiceException("系统配置项：" + sysConfig.getName() + "新增失败，名称重复。请检查后重新提交");
        }
        // 检查新增的类型
        if (ObjectUtils.isNotNull(mapper.loadByConfigType(sysConfig.getType()))) {
            log.error("系统配置项：{}新增失败，系统配置类型已存在。", sysConfig.getName());
            throw new ServiceException("系统配置项：" + sysConfig.getName() + "新增失败，系统配置类型已存在。请检查后重新提交");
        }
        // 创建时间
        sysConfig.setCreateTime(System.currentTimeMillis());
        // 修改时间
        sysConfig.setUpdateTime(System.currentTimeMillis());
        mapper.creates(sysConfig);
        log.info("{}新增系统配置项成功，新增内容：{}", DateUtils.timeFormat(new Date()), sysConfig);
        return true;
    }

    @Override
    public Boolean update(SysGlobalConfig sysConfig) {
        log.info("{}收到系统配置清数据修改，新增内容：{}", DateUtils.timeFormat(new Date()), sysConfig);
        SysGlobalConfig sysConfigByDbCrw = mapper.selectById(sysConfig.getId());
        if (ObjectUtils.isNull(sysConfigByDbCrw)) {
            log.error("系统配置项：{}修改失败，在当前库中未匹配到正常的配置数据。", sysConfig.getId());
            throw new ServiceException("系统配置项：" + sysConfig.getId() + "修改失败，在当前库中未匹配到正常的配置数据。请检查后重新提交");
        }
        // 检查新增的类型
        SysGlobalConfig configByTypeInDb = mapper.loadByConfigType(sysConfig.getType());
        if (ObjectUtils.isNotNull(configByTypeInDb) && !Objects.equals(configByTypeInDb.getId(), sysConfig.getId())) {
            log.error("系统配置项：{}修改失败，系统配置类型已存在。", sysConfig.getName());
            throw new ServiceException("系统配置项：" + sysConfig.getName() + "修改失败，系统配置类型已存在。请检查后重新提交");
        }
        // 内容
        sysConfigByDbCrw.setContent(sysConfig.getContent());
        // 排序
        sysConfigByDbCrw.setSort(sysConfig.getSort());
        // 修改时间
        sysConfigByDbCrw.setUpdateTime(System.currentTimeMillis());
        mapper.updateById(sysConfigByDbCrw);
        log.info("{}修改系统配置项成功，替换内容：{}", DateUtils.timeFormat(new Date()), sysConfig);
        return Boolean.TRUE;
    }

    @Override
    public Boolean delete(Long id) {
        log.info("{}收到系统配置删除：{}", DateUtils.timeFormat(new Date()), id);
        SysGlobalConfig sysConfigByCrw = mapper.selectById(id);
        if (ObjectUtils.isNull(sysConfigByCrw)) {
            log.error("系统配置项：{}删除失败，在当前库中未匹配到正常的配置数据。", id);
            throw new ServiceException("系统配置项：" + id + "删除失败，在当前库中未匹配到正常的配置数据。请检查后重新提交");
        }
        mapper.deleteById(sysConfigByCrw.getId());
        log.info("{}删除系统配置项成功，删除系统配置id:{}", DateUtils.timeFormat(new Date()), id);
        return Boolean.TRUE;
    }

    @Override
    public SysGlobalConfig loadById(Long id) {
        return mapper.selectById(id);
    }

    @Override
    public Boolean vailName(String name, Long configId) {
        SysGlobalConfig sysConfig = mapper.vailName(name);
        if (ObjectUtils.isNull(sysConfig)) {
            return true;
        } else {
            if (ObjectUtils.isNotNull(configId)) {
                return Objects.equals(configId, sysConfig.getId());
            } else {
                return false;
            }
        }
    }

    @Override
    public SysGlobalConfig loadByConfigType(Integer type) {
        return mapper.loadByConfigType(type);
    }
}
