package com.ruoyi.ibs.list.service.impl;



import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.ibs.list.domain.LowcodeVisstFeedbackModelDTO;
import com.ruoyi.ibs.list.mapper.LowcodeVisstFeedbackModelMapper;
import com.ruoyi.ibs.list.service.LowcodeVisstFeedbackModelService;
import com.ruoyi.ibs.list.domain.LowcodeVisstFeedbackModel;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.rmi.ServerException;
import java.util.*;
import java.util.stream.Collectors;

/**
 * 走访反馈搭建模板;(lowcode_visst_feedback_model)表服务实现类
 * @author : http://www.chiner.pro
 * @date : 2025-6-20
 */
@Service
public class LowcodeVisstFeedbackModelServiceImpl implements LowcodeVisstFeedbackModelService {
    @Resource
    private LowcodeVisstFeedbackModelMapper lowcodeVisstFeedbackModelMapper;

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    public LowcodeVisstFeedbackModel queryById(String uuid){
        LambdaQueryWrapper<LowcodeVisstFeedbackModel> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(LowcodeVisstFeedbackModel::getDeptId, SecurityUtils.getDeptId()/1000*1000);
        queryWrapper.eq(LowcodeVisstFeedbackModel::getUuid, uuid);
        return lowcodeVisstFeedbackModelMapper.selectOne(queryWrapper);
    }

    /**
     * 分页查询
     *
     * @return
     */
    public List<LowcodeVisstFeedbackModel> modeList(String modelName, String startDate, String endDate, String modelType){
        //1. 构建动态查询条件
        LambdaQueryWrapper<LowcodeVisstFeedbackModel> queryWrapper = new LambdaQueryWrapper<>();
        if(StringUtils.isNotBlank(modelName)){
            queryWrapper.like(LowcodeVisstFeedbackModel::getModelName,  modelName);
        }
        if(StringUtils.isNotBlank(startDate)){
            queryWrapper.ge(LowcodeVisstFeedbackModel::getCreatedTime, startDate);
        }
        if(StringUtils.isNotBlank(endDate)){
            queryWrapper.le(LowcodeVisstFeedbackModel::getCreatedTime, endDate);
        }
        if(StringUtils.isNotBlank(modelType)){
            queryWrapper.eq(LowcodeVisstFeedbackModel::getModelType, modelType);
        }
        queryWrapper.eq(LowcodeVisstFeedbackModel::getDeptId, SecurityUtils.getDeptId()/1000*1000);
        List<LowcodeVisstFeedbackModel> lowcodeVisstFeedbackModels = lowcodeVisstFeedbackModelMapper.selectList(queryWrapper);
        return lowcodeVisstFeedbackModels;
    }


   /**
     * 新增数据
     *
     * @param lowcodeVisstFeedbackModelDTO 实例对象
     * @return 实例对象
     */
   @Transactional
   public  int insert(LowcodeVisstFeedbackModelDTO lowcodeVisstFeedbackModelDTO){
        LambdaQueryWrapper<LowcodeVisstFeedbackModel> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(LowcodeVisstFeedbackModel::getDeptId, SecurityUtils.getDeptId()/1000*1000);
        List<LowcodeVisstFeedbackModel> lowcodeVisstFeedbackModels = lowcodeVisstFeedbackModelMapper.selectList(queryWrapper);
        modelDistinct(lowcodeVisstFeedbackModelDTO, lowcodeVisstFeedbackModels);


        LowcodeVisstFeedbackModel lowcodeVisstFeedbackModel = new LowcodeVisstFeedbackModel();
        BeanUtils.copyProperties(lowcodeVisstFeedbackModelDTO, lowcodeVisstFeedbackModel);
        lowcodeVisstFeedbackModel.setUuid(UUID.randomUUID().toString());
        lowcodeVisstFeedbackModel.setCreatedBy(SecurityUtils.getUsername());
        lowcodeVisstFeedbackModel.setCreatedTime(new java.util.Date());
        lowcodeVisstFeedbackModel.setDeptId(SecurityUtils.getDeptId()/1000*1000);
        lowcodeVisstFeedbackModel.setModelType(lowcodeVisstFeedbackModelDTO.getModelType());
        lowcodeVisstFeedbackModel.setBelongOutletId(lowcodeVisstFeedbackModelDTO.getBelongOutletIds());
        lowcodeVisstFeedbackModel.setBelongOutletName(lowcodeVisstFeedbackModelDTO.getBelongOutletNames());
        return  lowcodeVisstFeedbackModelMapper.insert(lowcodeVisstFeedbackModel);
    }

    private static void modelDistinct(LowcodeVisstFeedbackModelDTO lowcodeVisstFeedbackModelDTO, List<LowcodeVisstFeedbackModel> lowcodeVisstFeedbackModels) {
        if(lowcodeVisstFeedbackModels != null && lowcodeVisstFeedbackModels.size() > 0){
            if(lowcodeVisstFeedbackModels.stream().map(e->e.getModelName()).collect(Collectors.toList()).contains(lowcodeVisstFeedbackModelDTO.getModelName())){
                throw new ServiceException("模板名称重复");
            }
            if(lowcodeVisstFeedbackModelDTO.getBelongOutletIds() != null && lowcodeVisstFeedbackModelDTO.getBelongOutletIds().length() > 0){
                List<String> collect = lowcodeVisstFeedbackModels.stream().filter(e-> !StringUtils.isNotEmpty(e.getBelongOutletId())).map(e -> e.getBelongOutletId()).collect(Collectors.toList());
                List<String> outletsOld = new ArrayList<>();
                for (String co: collect ) {
                    outletsOld.addAll(Arrays.asList(co.split(",")));
                }
                Set<String> belongOutletIdsOldSet = new HashSet<>(outletsOld);
                List<String> listNew = Arrays.asList(lowcodeVisstFeedbackModelDTO.getBelongOutletIds().split(","));
                if(listNew.stream().anyMatch(belongOutletIdsOldSet::contains)){
                    throw new ServiceException(" 网点重复！");
                }
            }
        }
    }

    /**
     * 更新数据
     *
     * @param lowcodeVisstFeedbackModel 实例对象
     * @return
     */
    @Transactional
    public int update(LowcodeVisstFeedbackModelDTO lowcodeVisstFeedbackModel){
        LambdaQueryWrapper<LowcodeVisstFeedbackModel> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(LowcodeVisstFeedbackModel::getDeptId, SecurityUtils.getDeptId()/1000*1000);
        queryWrapper.ne(LowcodeVisstFeedbackModel::getUuid, lowcodeVisstFeedbackModel.getUuid());
        List<LowcodeVisstFeedbackModel> lowcodeVisstFeedbackModels = lowcodeVisstFeedbackModelMapper.selectList(queryWrapper);
        modelDistinct(lowcodeVisstFeedbackModel, lowcodeVisstFeedbackModels);


        //1. 根据条件动态更新
        LambdaUpdateChainWrapper<LowcodeVisstFeedbackModel> chainWrapper = new LambdaUpdateChainWrapper<LowcodeVisstFeedbackModel>(lowcodeVisstFeedbackModelMapper);
        if(StringUtils.isNotBlank(lowcodeVisstFeedbackModel.getModelName())){
            chainWrapper.set(LowcodeVisstFeedbackModel::getModelName, lowcodeVisstFeedbackModel.getModelName());
        }
        if(StringUtils.isNotBlank(lowcodeVisstFeedbackModel.getModelDetal())){
            chainWrapper.set(LowcodeVisstFeedbackModel::getModelDetal, lowcodeVisstFeedbackModel.getModelDetal());
        }
        if(StringUtils.isNotBlank(lowcodeVisstFeedbackModel.getModelType())){
            chainWrapper.set(LowcodeVisstFeedbackModel::getModelType, lowcodeVisstFeedbackModel.getModelType());
        }
        if(StringUtils.isNotBlank(lowcodeVisstFeedbackModel.getBelongOutletNames())){
            chainWrapper.set(LowcodeVisstFeedbackModel::getBelongOutletName, lowcodeVisstFeedbackModel.getBelongOutletNames());
        }
        if(StringUtils.isNotBlank(lowcodeVisstFeedbackModel.getBelongOutletIds())){
            chainWrapper.set(LowcodeVisstFeedbackModel::getBelongOutletId, lowcodeVisstFeedbackModel.getBelongOutletIds());
        }
        chainWrapper.set(LowcodeVisstFeedbackModel::getUpdatedBy, SecurityUtils.getUsername());
        chainWrapper.set(LowcodeVisstFeedbackModel::getUpdatedTime, new Date());
        //2. 设置主键，并更新
        chainWrapper.eq(LowcodeVisstFeedbackModel::getUuid, lowcodeVisstFeedbackModel.getUuid());
        boolean ret = chainWrapper.update();
        //3. 更新成功了，查询最最对象返回
        if(ret){
            return 1;
        }else{
            return 0;
        }
    }


    @Transactional
    public boolean deleteById(String uuid){
        LambdaQueryWrapper<LowcodeVisstFeedbackModel> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(LowcodeVisstFeedbackModel::getDeptId, SecurityUtils.getDeptId()/1000*1000);
        queryWrapper.eq(LowcodeVisstFeedbackModel::getUuid, uuid);
        List<LowcodeVisstFeedbackModel> lowcodeVisstFeedbackModels = lowcodeVisstFeedbackModelMapper.selectList(queryWrapper);

        if(lowcodeVisstFeedbackModels.size()  == 0){
           throw new ServiceException("删除失败，数据不存在");
        }

        LambdaQueryWrapper<LowcodeVisstFeedbackModel> deleteWrapper = new LambdaQueryWrapper<>();
        deleteWrapper.eq(LowcodeVisstFeedbackModel::getUuid, uuid);
        int total = lowcodeVisstFeedbackModelMapper.delete(deleteWrapper);
        return total > 0;
    }
}
