package cn.newfeifan.mall.module.system.service.config;

import cn.newfeifan.mall.framework.common.pojo.PageResult;
import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
import cn.newfeifan.mall.module.system.config.StartConfig;
import cn.newfeifan.mall.module.system.controller.admin.config.bo.SystemConfigBO;
import cn.newfeifan.mall.module.system.controller.admin.config.vo.ConfigPageReqVO;
import cn.newfeifan.mall.module.system.controller.admin.config.vo.ConfigSaveReqVO;
import cn.newfeifan.mall.module.system.dal.dataobject.config.SystemConfigDO;
import cn.newfeifan.mall.module.system.dal.mysql.config.SystemConfigMapper;
import com.alibaba.fastjson.JSONObject;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import javax.annotation.Resource;

import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.newfeifan.mall.module.system.constant.SystemConstants.SYSTEM_CONFIG;
import static cn.newfeifan.mall.module.system.enums.ErrorCodeConstants.CONFIG_NOT_EXISTS;
import static cn.newfeifan.mall.module.system.enums.ErrorCodeConstants.CONFIG_REDIS_NOT_EXISTS;

/**
 * 系统配置 Service 实现类
 *
 * @author 非繁人
 */
@Service
@Validated
public class SystemConfigServiceImpl implements SystemConfigService {

    @Resource
    private SystemConfigMapper systemConfigMapper;
    @Resource
    private StringRedisTemplate stringRedisTemplate;
    @Resource
    @Lazy
    private StartConfig startConfig;

    @Override
    public Long createConfig(ConfigSaveReqVO createReqVO) {
        // 插入
        SystemConfigDO config = BeanUtils.toBean(createReqVO, SystemConfigDO.class);
        systemConfigMapper.insert(config);
        // 返回
        return config.getId();
    }

    @Override
    public void updateConfig(ConfigSaveReqVO updateReqVO) {
        // 校验存在
        validateConfigExists(updateReqVO.getId());
        // 更新
        SystemConfigDO updateObj = BeanUtils.toBean(updateReqVO, SystemConfigDO.class);
        systemConfigMapper.updateById(updateObj);
    }

    @Override
    public void deleteConfig(Long id) {
        // 校验存在
        validateConfigExists(id);
        // 删除
        systemConfigMapper.deleteById(id);
    }

    private void validateConfigExists(Long id) {
        if (systemConfigMapper.selectById(id) == null) {
            throw exception(CONFIG_NOT_EXISTS);
        }
    }

    @Override
    public SystemConfigDO getConfig(Long id) {
        return systemConfigMapper.selectById(id);
    }

    @Override
    public SystemConfigDO getConfig() {
        return systemConfigMapper.selectList().get(0);
    }

    @Override
    public SystemConfigDO getRedisConfig() {
        String s = stringRedisTemplate.opsForValue().get(SYSTEM_CONFIG);

        // 第一次判断是因为redis配置了自动删除
        if (s == null) {
            startConfig.initSystemConfig();
            s = stringRedisTemplate.opsForValue().get(SYSTEM_CONFIG);
        }

        // 第二次判断如果还是为空,那就缓存到redis的程序写错了
        if(s == null){
            throw exception(CONFIG_REDIS_NOT_EXISTS);
        }

        SystemConfigBO systemConfigBO = JSONObject.parseObject(s, SystemConfigBO.class);
        return SystemConfigDO.builder()
                .id(systemConfigBO.getId())
                .mallDomain(systemConfigBO.getMallDomain())
                .merchantDomain(systemConfigBO.getMerchantDomain())
                .platformDomain(systemConfigBO.getPlatformDomain())
                .build();
    }

    @Override
    public PageResult<SystemConfigDO> getConfigPage(ConfigPageReqVO pageReqVO) {
        return systemConfigMapper.selectPage(pageReqVO);
    }

}