package com.ruoyi.hywz.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.hywz.entity.AdsMatHyxtStampTaxWarningD;
import com.ruoyi.hywz.mapper.AdsMatHyxtStampTaxWarningDMapper;
import com.ruoyi.hywz.service.IAdsMatHyxtStampTaxContractDService;
import com.ruoyi.hywz.service.IAdsMatHyxtStampTaxInvoiceDService;
import com.ruoyi.hywz.service.IAdsMatHyxtStampTaxWarningDService;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * <p>
 * 【印花税】预警表 服务实现类
 * </p>
 *
 * @author mybatisplus-generator
 * @date 2024-07-17 16:58:32
 */
@Service
public class AdsMatHyxtStampTaxWarningDServiceImpl extends ServiceImpl<AdsMatHyxtStampTaxWarningDMapper,AdsMatHyxtStampTaxWarningD> implements IAdsMatHyxtStampTaxWarningDService {

    @Resource
    private IAdsMatHyxtStampTaxInvoiceDService adsMatHyxtStampTaxInvoiceDService;
    @Resource
    private IAdsMatHyxtStampTaxContractDService adsMatHyxtStampTaxContractDService;

    @Override
    public Page<AdsMatHyxtStampTaxWarningD> queryPage(Long pageSize, Long pageNo, AdsMatHyxtStampTaxWarningD param) {
        Page<AdsMatHyxtStampTaxWarningD> page = new Page<>();
        page.setSize(pageSize);
        page.setCurrent(pageNo);

        LambdaQueryWrapper<AdsMatHyxtStampTaxWarningD> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(AdsMatHyxtStampTaxWarningD::getIsDeleted, 0);
        if (null != param) {
            queryWrapper.eq(ObjectUtils.isNotEmpty(param.getSourceType()), AdsMatHyxtStampTaxWarningD::getSourceType, param.getSourceType());
            queryWrapper.eq(StringUtils.isNotBlank(param.getSourceId()), AdsMatHyxtStampTaxWarningD::getSourceId, param.getSourceId());
            queryWrapper.eq(ObjectUtils.isNotEmpty(param.getStatus()), AdsMatHyxtStampTaxWarningD::getStatus, param.getStatus());
            queryWrapper.eq(ObjectUtils.isNotEmpty(param.getOrgNo()), AdsMatHyxtStampTaxWarningD::getOrgNo, param.getOrgNo());
        }

        queryWrapper.orderByDesc(AdsMatHyxtStampTaxWarningD::getCreateTime);
        queryWrapper.orderByDesc(AdsMatHyxtStampTaxWarningD::getStatus);

        return this.page(page, queryWrapper);
    }

    @Override
    public List<AdsMatHyxtStampTaxWarningD> getList(Integer sourceType, String sourceId, Integer status) {
        LambdaQueryWrapper<AdsMatHyxtStampTaxWarningD> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(AdsMatHyxtStampTaxWarningD::getSourceType, sourceType);
        queryWrapper.eq(AdsMatHyxtStampTaxWarningD::getSourceId, sourceId);
        queryWrapper.eq(AdsMatHyxtStampTaxWarningD::getStatus, status);
        queryWrapper.eq(AdsMatHyxtStampTaxWarningD::getIsDeleted, 0);
        return this.list(queryWrapper);
    }

    @Override
    public List<AdsMatHyxtStampTaxWarningD> getList(Integer status) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        LambdaQueryWrapper<AdsMatHyxtStampTaxWarningD> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(AdsMatHyxtStampTaxWarningD::getIsDeleted, 0);
        queryWrapper.eq(AdsMatHyxtStampTaxWarningD::getWarningLevel, "强控");
        queryWrapper.eq(AdsMatHyxtStampTaxWarningD::getStatus, status);
        queryWrapper.eq(AdsMatHyxtStampTaxWarningD::getOrgNo, loginUser.getOrgNo());
        return this.list(queryWrapper);
    }

    @Override
    public void batchAddOrUpdate(List<AdsMatHyxtStampTaxWarningD> list) {
//        this.clearAll();
        this.updateIsDelete();
        this.batchUpdateIsWarning(0);
        for (AdsMatHyxtStampTaxWarningD warningD : list) {
            if (this.checkExist(warningD)) {
                // 更新
                this.update(warningD);
            } else {
                // 新增
                warningD.setCreateTime(new Date());
                baseMapper.insert(warningD);
            }
        }

        // 业务数据预警标记与取消
        List<AdsMatHyxtStampTaxWarningD> allData = this.getList();
        for (AdsMatHyxtStampTaxWarningD item : allData) {
            this.updateBaseDataIsWarning(item);
        }

        this.clearIsDelete();

    }

    @Override
    public void updateBaseDataIsWarning(AdsMatHyxtStampTaxWarningD warningD) {
        // 检查该数据，预警表是否还存在预警数据，如果不存在则消除预警，存在则标记预警
//        List<AdsMatHyxtStampTaxWarningD> list = this.getList(warningD.getSourceType(), warningD.getSourceId(), 0);
//        if (!list.isEmpty()) {
//            this.update(warningD, 1);
//        } else {
//            this.update(warningD, 0);
//        }
    }

    @Override
    public void clearWarningByData(AdsMatHyxtStampTaxWarningD warningD) {
//        Integer sourceType = warningD.getSourceType();
//        if (sourceType == 0) {
//            adsMatHyxtStampTaxContractDService.updateIsWarning(warningD.getSourceId(), 0, warningD.getWarningType());
//        } else {
//            adsMatHyxtStampTaxInvoiceDService.updateIsWarning(warningD.getSourceId(), 0, warningD.getWarningType());
//        }
    }

    public List<AdsMatHyxtStampTaxWarningD> getList() {
        LambdaQueryWrapper<AdsMatHyxtStampTaxWarningD> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(AdsMatHyxtStampTaxWarningD::getIsDeleted, 0);
        return this.list(queryWrapper);
    }

    /**
     * 批量更新业务数据是否预警
     */
    public void batchUpdateIsWarning(Integer isWarning) {
        adsMatHyxtStampTaxContractDService.batchUpdateIsWarning(isWarning);
        adsMatHyxtStampTaxInvoiceDService.batchUpdateIsWarning(isWarning);
    }

    private void update(AdsMatHyxtStampTaxWarningD warningD, Integer isWarning) {
//        Integer sourceType = warningD.getSourceType();
//        String warningLevel = warningD.getWarningLevel();
//        if (StringUtils.isNotBlank(warningLevel) && warningLevel.equals("强控")) {
//            isWarning = 1;
//        }
//        if (StringUtils.isNotBlank(warningLevel) && warningLevel.equals("弱控")) {
//            isWarning = 2;
//        }
//        if (sourceType == 0) {
//            adsMatHyxtStampTaxContractDService.updateIsWarning(warningD.getSourceId(), isWarning, warningD.getWarningType());
//        } else {
//            adsMatHyxtStampTaxInvoiceDService.updateIsWarning(warningD.getSourceId(), isWarning, warningD.getWarningType());
//        }
    }

    private boolean checkExist(AdsMatHyxtStampTaxWarningD warningD) {
        LambdaQueryWrapper<AdsMatHyxtStampTaxWarningD> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(AdsMatHyxtStampTaxWarningD::getSourceType, warningD.getSourceType());
        queryWrapper.eq(AdsMatHyxtStampTaxWarningD::getSourceId, warningD.getSourceId());
        queryWrapper.eq(AdsMatHyxtStampTaxWarningD::getContent, warningD.getContent());
        queryWrapper.eq(AdsMatHyxtStampTaxWarningD::getStatus, 1);
        queryWrapper.eq(AdsMatHyxtStampTaxWarningD::getOrgNo, warningD.getOrgNo());
//        queryWrapper.eq(AdsMatHyxtStampTaxWarningD::getIsDeleted, 0);
        List<AdsMatHyxtStampTaxWarningD> result = baseMapper.selectList(queryWrapper);
        return !result.isEmpty();
    }

    private void update(AdsMatHyxtStampTaxWarningD warningD) {
        LambdaUpdateWrapper<AdsMatHyxtStampTaxWarningD> updateWrapper = Wrappers.lambdaUpdate();
        updateWrapper.eq(AdsMatHyxtStampTaxWarningD::getSourceType, warningD.getSourceType());
        updateWrapper.eq(AdsMatHyxtStampTaxWarningD::getSourceId, warningD.getSourceId());
        updateWrapper.eq(AdsMatHyxtStampTaxWarningD::getContent, warningD.getContent());
        updateWrapper.eq(AdsMatHyxtStampTaxWarningD::getWarningType, warningD.getWarningType());
        updateWrapper.set(AdsMatHyxtStampTaxWarningD::getCreateTime, new Date());
        updateWrapper.set(AdsMatHyxtStampTaxWarningD::getUpdateTime, new Date());
        updateWrapper.set(AdsMatHyxtStampTaxWarningD::getIsDeleted, 0);
        this.update(updateWrapper);
    }

    private void updateIsDelete() {
        LambdaUpdateWrapper<AdsMatHyxtStampTaxWarningD> updateWrapper  = Wrappers.lambdaUpdate();
        updateWrapper.set(AdsMatHyxtStampTaxWarningD::getIsDeleted, 1);
        updateWrapper.set(AdsMatHyxtStampTaxWarningD::getUpdateTime, new Date());
        this.update(updateWrapper);
    }

    @Override
    public void clearAll() {
        baseMapper.delete(Wrappers.lambdaQuery());
    }

    @Override
    public void clearIsDelete() {
        LambdaQueryWrapper<AdsMatHyxtStampTaxWarningD> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(AdsMatHyxtStampTaxWarningD::getIsDeleted, 1);
        baseMapper.delete(queryWrapper);
    }

    @Override
    public void clearWarning() {
        this.updateIsDelete();
        this.batchUpdateIsWarning(0);
        this.clearIsDelete();
    }

}
