package com.fzm.mall.server.admin.system.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.SystemClock;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fzm.mall.server.admin.constant.MallResponseError;
import com.fzm.mall.server.admin.exception.MyException;
import com.fzm.mall.server.admin.system.entity.dto.SysConfigDTO;
import com.fzm.mall.server.admin.system.entity.dto.SysConfigSaveDTO;
import com.fzm.mall.server.admin.system.entity.dto.SysConfigUpdateDTO;
import com.fzm.mall.server.admin.system.mapper.SysConfigMapper;
import com.fzm.mall.server.admin.system.model.SysConfig;
import com.fzm.mall.server.admin.system.service.ISysConfigService;
import com.fzm.mall.server.admin.util.CopyUtil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

/**
 * <p>
 * 系统配置表 服务实现类
 * </p>
 *
 * @author wulixian
 * @since 2021-03-29
 */
@Service
@Transactional
public class SysConfigServiceImpl extends ServiceImpl<SysConfigMapper, SysConfig> implements ISysConfigService {

    @Resource
    private SysConfigMapper sysConfigMapper;

    @Override
    public void save(SysConfigSaveDTO sysConfigSaveDTO) {
        SysConfig sysConfig = CopyUtil.to(sysConfigSaveDTO, SysConfig.class);
        sysConfig.init();

        sysConfigMapper.insert(sysConfig);
    }

    @Override
    public void update(SysConfigUpdateDTO sysConfigUpdateDTO) {
        SysConfig sysConfig = CopyUtil.to(sysConfigUpdateDTO, SysConfig.class);
        UpdateWrapper<SysConfig> wrapper = new UpdateWrapper<>();
        wrapper.eq("config_id", sysConfig.getConfigId())
                .eq("update_time", sysConfig.getUpdateTime());
        int update = sysConfigMapper.update(sysConfig, wrapper);
        if (update == 0) {
            throw new MyException(MallResponseError.UPDATE_FAIL);
        }
    }

    @Override
    public void delete(String configId) {
        UpdateWrapper<SysConfig> wrapper = new UpdateWrapper<>();
        wrapper.eq("config_id", configId)
                .set("status", true);
        sysConfigMapper.update(null, wrapper);
    }

    @Override
    public SysConfigDTO read(String configId) {
        SysConfig config = sysConfigMapper.selectOne(new QueryWrapper<SysConfig>().eq("config_id", configId));
        return CopyUtil.to(config, SysConfigDTO.class);
    }

    @Override
    public IPage<SysConfigDTO> page(Page<SysConfigDTO> page, String keyword) {
        return sysConfigMapper.page(page, keyword);
    }

    /**
     * 系统中心-全局配置-启用状态-编辑
     *
     * @param configId
     * @param validState
     * @param updateTime
     */
    @Override
    public void validStateUpdate(String configId, Boolean validState, Long updateTime) {
        UpdateWrapper<SysConfig> wrapper = new UpdateWrapper<>();
        wrapper.eq("config_id", configId)
                .eq("update_time", updateTime)
                .set("update_time", SystemClock.now())
                .set("valid_state", validState);
        int update = sysConfigMapper.update(null, wrapper);
        if (update == 0) {
            throw new MyException(MallResponseError.UPDATE_FAIL);
        }
    }
}
