package com.njcn.cssystem.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.cssystem.mapper.CsAlarmSetMapper;
import com.njcn.cssystem.pojo.param.CsAlarmSetParam;
import com.njcn.cssystem.pojo.po.CsAlarmSet;
import com.njcn.cssystem.service.ICsAlarmSetService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Objects;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author xy
 * @since 2026-05-08
 */
@Service
public class CsAlarmSetServiceImpl extends ServiceImpl<CsAlarmSetMapper, CsAlarmSet> implements ICsAlarmSetService {

    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean add(CsAlarmSetParam param) {
        CsAlarmSet csAlarmSet = new CsAlarmSet();
        BeanUtils.copyProperties(param, csAlarmSet);
        if (Objects.isNull(csAlarmSet.getActive())) {
            csAlarmSet.setActive(0);
        }
        return this.save(csAlarmSet);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean update(CsAlarmSetParam param) {
        CsAlarmSet csAlarmSet = new CsAlarmSet();
        BeanUtils.copyProperties(param, csAlarmSet);
        return this.updateById(csAlarmSet);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean delete(String id) {
        CsAlarmSet csAlarmSet = this.baseMapper.selectById(id);
        if (Objects.nonNull(csAlarmSet) && Objects.equals(csAlarmSet.getActive(), 1)) {
            throw new BusinessException("不能删除已启用的配置");
        }
        return this.removeById(id);
    }

    @Override
    public CsAlarmSet getById(String id) {
        return this.baseMapper.selectById(id);
    }

    @Override
    public List<CsAlarmSet> listAll() {
        LambdaQueryWrapper<CsAlarmSet> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.orderByDesc(CsAlarmSet::getCreateTime);
        return this.list(queryWrapper);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean toggleActive(String id) {
        CsAlarmSet csAlarmSet = this.baseMapper.selectById(id);
        if (Objects.isNull(csAlarmSet)) {
            throw new BusinessException("配置不存在");
        }

        if (Objects.equals(csAlarmSet.getActive(), 1)) {
            long enabledCount = this.count(new LambdaQueryWrapper<CsAlarmSet>().eq(CsAlarmSet::getActive, 1));
            if (enabledCount <= 1) {
                throw new BusinessException("至少需要保留一条启用的配置");
            }
            csAlarmSet.setActive(0);
        } else {
            LambdaUpdateWrapper<CsAlarmSet> updateWrapper = new LambdaUpdateWrapper<>();
            updateWrapper.set(CsAlarmSet::getActive, 0);
            this.update(updateWrapper);
            csAlarmSet.setActive(1);
        }
        return this.updateById(csAlarmSet);
    }

    @Override
    public CsAlarmSet getEnabledConfig() {
        LambdaQueryWrapper<CsAlarmSet> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(CsAlarmSet::getActive, 1);
        queryWrapper.last("limit 1");
        return this.getOne(queryWrapper);
    }

}
