package org.nl.system.service.param.impl;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.domain.query.PageQuery;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.SecurityUtils;
import org.nl.config.MapOf;
import org.nl.system.service.param.ISysParamService;
import org.nl.system.service.param.dao.Param;
import org.nl.system.service.param.dao.mapper.SysParamMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 系统参数表 服务实现类
 * </p>
 *
 * @author generator
 * @since 2022-12-14
 */
@Slf4j
@Service
public class SysParamServiceImpl extends ServiceImpl<SysParamMapper, Param> implements ISysParamService {

    @Autowired
    private SysParamMapper paramMapper;

    @Override
    public Page<Param> queryPage(Map whereJson, PageQuery page) {
        QueryWrapper<Param> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderBy(true, true, "create_time");
        Page<Param> paramPage = paramMapper.selectPage(page.build(), queryWrapper);
        return paramPage;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void create(Param param) {
        List code = paramMapper.selectByMap(MapOf.of("code", param.getCode()));
        if (ObjectUtil.isNotEmpty(code)) throw new BadRequestException("编码不能一致");
        param.setId(IdUtil.getSnowflake(1, 1).nextIdStr());
        String currentUserId = SecurityUtils.getCurrentUserId();
        String nickName = SecurityUtils.getCurrentNickName();
        String now = DateUtil.now();
        param.setCreate_id(currentUserId);
        param.setCreate_name(nickName);
        param.setCreate_time(now);
        param.setUpdate_id(currentUserId);
        param.setUpdate_name(nickName);
        param.setUpdate_time(now);
        paramMapper.insert(param);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void update(Param param) {
        Param paramObj = paramMapper.selectById(param.getId());
        if (ObjectUtil.isEmpty(paramObj)) {
            throw new BadRequestException("被删除或无权限，操作失败!");
        }
        Param param1 = paramMapper.selectOne(new LambdaQueryWrapper<Param>().eq(Param::getCode, param.getCode())
                .and(lam -> lam.ne(Param::getId, param.getId())));
        if (ObjectUtil.isNotEmpty(param1)) {
            throw new BadRequestException("编码[" + param.getCode() + "]已存在");
        }
        param.setUpdate_id(SecurityUtils.getCurrentUserId());
        param.setUpdate_name(SecurityUtils.getCurrentNickName());
        param.setUpdate_time(DateUtil.now());
        paramMapper.updateById(param);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteByIds(List<String> ids) {
        paramMapper.deleteBatchIds(ids);
    }

    @Override
    public Param findByCode(String code) {
        QueryWrapper<Param> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("code", code);
        Param param = paramMapper.selectOne(queryWrapper);
        return param;
    }
}
