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

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.wechatmsgtemplate.bo.WechatMsgTemplateBO;
import cn.newfeifan.mall.module.system.controller.admin.wechatmsgtemplate.vo.WechatMsgTemplatePageReqVO;
import cn.newfeifan.mall.module.system.controller.admin.wechatmsgtemplate.vo.WechatMsgTemplateSaveReqVO;
import cn.newfeifan.mall.module.system.dal.dataobject.wechatmsgtemplate.WechatMsgTemplateDO;
import cn.newfeifan.mall.module.system.dal.mysql.wechatmsgtemplate.WechatMsgTemplateMapper;
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 java.util.List;

import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.newfeifan.mall.module.system.constant.SystemConstants.SYSTEM_WX_MESSAGE_TEMPLATE;
import static cn.newfeifan.mall.module.system.enums.ErrorCodeConstants.WECHAT_MSG_TEMPLATE_NOT_EXISTS;
import static cn.newfeifan.mall.module.system.enums.ErrorCodeConstants.WECHAT_MSG_TEMPLATE_REDIS_NOT_EXISTS;

/**
 * 微信消息模板 Service 实现类
 *
 * @author 非繁人
 */
@Service
@Validated
public class WechatMsgTemplateServiceImpl implements WechatMsgTemplateService {

    @Resource
    private WechatMsgTemplateMapper wechatMsgTemplateMapper;

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Resource
    @Lazy
    private StartConfig startConfig;

    @Override
    public Long createWechatMsgTemplate(WechatMsgTemplateSaveReqVO createReqVO) {
        // 插入
        WechatMsgTemplateDO wechatMsgTemplate = BeanUtils.toBean(createReqVO, WechatMsgTemplateDO.class);
        wechatMsgTemplateMapper.insert(wechatMsgTemplate);
        // 返回
        return wechatMsgTemplate.getId();
    }

    @Override
    public void updateWechatMsgTemplate(WechatMsgTemplateSaveReqVO updateReqVO) {
        // 校验存在
        validateWechatMsgTemplateExists(updateReqVO.getId());
        // 更新
        WechatMsgTemplateDO updateObj = BeanUtils.toBean(updateReqVO, WechatMsgTemplateDO.class);
        wechatMsgTemplateMapper.updateById(updateObj);
    }

    @Override
    public void deleteWechatMsgTemplate(Long id) {
        // 校验存在
        validateWechatMsgTemplateExists(id);
        // 删除
        wechatMsgTemplateMapper.deleteById(id);
    }

    private void validateWechatMsgTemplateExists(Long id) {
        if (wechatMsgTemplateMapper.selectById(id) == null) {
            throw exception(WECHAT_MSG_TEMPLATE_NOT_EXISTS);
        }
    }

    @Override
    public WechatMsgTemplateDO getWechatMsgTemplate(Long id) {
        return wechatMsgTemplateMapper.selectById(id);
    }

    @Override
    public PageResult<WechatMsgTemplateDO> getWechatMsgTemplatePage(WechatMsgTemplatePageReqVO pageReqVO) {
        return wechatMsgTemplateMapper.selectPage(pageReqVO);
    }

    @Override
    public WechatMsgTemplateDO getWechatSsgTemplate(Long wechatMsgId) {
        String s = stringRedisTemplate.opsForValue().get(SYSTEM_WX_MESSAGE_TEMPLATE + wechatMsgId);

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

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

        WechatMsgTemplateBO wechatMsgTemplateBO = JSONObject.parseObject(s, WechatMsgTemplateBO.class);
        return WechatMsgTemplateDO.builder()
                .wechatMsgTemplateId(wechatMsgTemplateBO.getWechatMsgTemplateId())
                .messageTemplateParameters(wechatMsgTemplateBO.getMessageTemplateParameters())
                .remark(wechatMsgTemplateBO.getRemark())
                .id(wechatMsgTemplateBO.getId())
                .build();
    }

    @Override
    public List<WechatMsgTemplateDO> selectList() {
        return wechatMsgTemplateMapper.selectList();
    }

}