package com.xinelu.manage.service.wechattemplate.impl;

import com.xinelu.common.annotation.DataScope;
import com.xinelu.common.core.domain.entity.SysDictData;
import com.xinelu.common.exception.ServiceException;
import com.xinelu.common.utils.SecurityUtils;
import com.xinelu.common.utils.bean.BeanUtils;
import com.xinelu.common.utils.uuid.IdUtils;
import com.xinelu.manage.domain.wechattemplate.WechatTemplate;
import com.xinelu.manage.domain.wechattemplatesuittask.WechatTemplateSuitTask;
import com.xinelu.manage.dto.wechattemplate.WechatTemplateDTO;
import com.xinelu.manage.dto.wechattemplate.WechatTemplateTaskDTO;
import com.xinelu.manage.mapper.wechattemplate.WechatTemplateMapper;
import com.xinelu.manage.service.wechattemplate.IWechatTemplateService;
import com.xinelu.manage.vo.wechattemplate.WechatTemplateTaskVO;
import com.xinelu.manage.vo.wechattemplate.WechatTemplateVO;
import com.xinelu.system.mapper.SysDictDataMapper;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * 微信模板信息Service业务层处理
 *
 * @author xinelu
 * @date 2024-02-27
 */
@Service
public class WechatTemplateServiceImpl implements IWechatTemplateService {
    @Resource
    private WechatTemplateMapper wechatTemplateMapper;

    @Resource
    private SysDictDataMapper sysDictDataMapper;

    /**
     * 查询微信模板信息
     *
     * @param id 微信模板信息主键
     * @return 微信模板信息
     */
    @Override
    public WechatTemplate selectWechatTemplateById(Long id) {
        return wechatTemplateMapper.selectWechatTemplateById(id);
    }

    /**
     * 查询微信模板信息列表
     *
     * @param wechatTemplateDto 微信模板信息
     * @return 微信模板信息
     */
    @DataScope(agencyAlias = "d", deptAlias = "wt")
    @Override
    public List<WechatTemplateTaskVO> selectWechatTemplateList(WechatTemplateDTO wechatTemplateDto) {
	    return wechatTemplateMapper.selectWechatTemplateDtoList(wechatTemplateDto);
    }

    /**
     * 新增微信模板信息
     *
     * @param wechatTemplateTaskDTO 微信模板信息
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int insertWechatTemplate(WechatTemplateTaskDTO wechatTemplateTaskDTO) {
        // 检查微信名称是否已存在
        if (wechatTemplateMapper.countByWechatTemplateTaskDTO(wechatTemplateTaskDTO) > 0) {
            throw new ServiceException("微信模板名称已存在");
        }

        // 设置创建者和创建时间
        String currentUsername = SecurityUtils.getUsername();
        LocalDateTime currentTime = LocalDateTime.now();
        wechatTemplateTaskDTO.setCreateBy(currentUsername);
        wechatTemplateTaskDTO.setCreateTime(currentTime);

        // 将wechatTemplateTaskDTO对象的属性复制到wechatTemplate对象
        WechatTemplate wechatTemplate = new WechatTemplate();
        BeanUtils.copyProperties(wechatTemplateTaskDTO, wechatTemplate);
        // 插入wechatTemplate记录并检查结果
        if (wechatTemplateMapper.insertWechatTemplate(wechatTemplate) <= 0) {
            throw new ServiceException("新增微信模板失败");
        }

        // 批量创建WechatTemplateSuitTask对象并插入
        List<WechatTemplateSuitTask> tasks = new ArrayList<>();
        for (Long suitTaskTypeId : wechatTemplateTaskDTO.getSuitTaskTypeIds()) {
            WechatTemplateSuitTask task = createWechatTempSuitTask(suitTaskTypeId, wechatTemplate.getId(), currentUsername, currentTime);
            tasks.add(task);
        }

        // 批量插入TextMessageSuitTask记录并检查结果
        if (!tasks.isEmpty() && wechatTemplateMapper.insertWechatTemplateSuitTask(tasks) != tasks.size()) {
            throw new ServiceException("新增微信模板适用任务类型失败");
        }

        // 返回成功插入的记录数
        return 1;
    }

    private WechatTemplateSuitTask createWechatTempSuitTask(Long suitTaskTypeId, Long wechatTempId, String createdBy, LocalDateTime createdAt) {
        SysDictData sysDictData = sysDictDataMapper.selectDictDataById(suitTaskTypeId);
        WechatTemplateSuitTask task = new WechatTemplateSuitTask();
        task.setWechatTemplateId(wechatTempId);
        task.setSuitTaskTypeId(suitTaskTypeId);
        task.setSuitTaskTypeName(sysDictData.getDictLabel());
        task.setCreateBy(createdBy);
        task.setCreateTime(createdAt);
        return task;
    }

    /**
     * 修改微信模板信息
     *
     * @param wechatTemplateTaskDTO 微信模板信息
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int updateWechatTemplate(WechatTemplateTaskDTO wechatTemplateTaskDTO) {
        // 检查除当前记录之外是否存在同名的微信模板名称
        if (wechatTemplateMapper.countByWechatTemplateNameExcludingId(wechatTemplateTaskDTO.getId(), wechatTemplateTaskDTO.getDepartmentId(), wechatTemplateTaskDTO.getWechatTemplateName(), wechatTemplateTaskDTO.getTemplateSource()) > 0) {
            throw new ServiceException("微信模板名称已存在");
        }
        // 设置修改者和修改时间
        String editUsername = SecurityUtils.getUsername();
        LocalDateTime editTime = LocalDateTime.now();
        wechatTemplateTaskDTO.setUpdateBy(editUsername);
        wechatTemplateTaskDTO.setUpdateTime(editTime);

        // 将wechatTemplateTaskDTO对象的属性复制到wechatTemplate对象
        WechatTemplate wechatTemplate = new WechatTemplate();
        BeanUtils.copyProperties(wechatTemplateTaskDTO, wechatTemplate);

        // 修改wechatTemplate记录并检查结果
        if (wechatTemplateMapper.updateWechatTemplate(wechatTemplate) <= 0) {
            throw new ServiceException("修改微信模板失败");
        }

        // 根据id删除之前存储的适用模板任务类型
        wechatTemplateMapper.deleteWechatTemplateSuitTaskById(wechatTemplateTaskDTO.getId());

        // 批量创建WechatTemplateSuitTask对象并插入修改
        List<WechatTemplateSuitTask> tasks = new ArrayList<>();
        for (Long suitTaskTypeId : wechatTemplateTaskDTO.getSuitTaskTypeIds()) {
            WechatTemplateSuitTask task = createWechatTempSuitTask(suitTaskTypeId, wechatTemplate.getId(), editUsername, editTime);
            tasks.add(task);
        }

        // 批量插入WechatTemplateSuitTask修改记录并检查结果
        if (!tasks.isEmpty() && wechatTemplateMapper.insertWechatTemplateSuitTask(tasks) != tasks.size()) {
            throw new ServiceException("修改微信模板适用任务类型失败");
        }

        // 返回成功插入的记录数
        return 1;
    }


    /**
     * 批量删除微信模板信息
     *
     * @param ids 需要删除的微信模板信息主键
     * @return 结果
     */
    @Override
    public int deleteWechatTemplateByIds(Long[] ids) {
        // 删除微信模板记录并检查结果
        if (wechatTemplateMapper.deleteWechatTemplateByIds(ids) <= 0) {
            throw new ServiceException("删除微信模板失败");
        }
        // 删除微信模板适用任务类型记录并检查结果
        if (wechatTemplateMapper.deleteWechatTemplateSuitTaskByIds(ids) < 0) {
            throw new ServiceException("删除微信模板适用任务类型失败");
        }
        // 返回成功删除的记录数
        return 1;
    }

    /**
     * 删除微信模板信息信息
     *
     * @param id 微信模板信息主键
     * @return 结果
     */
    @Override
    public int deleteWechatTemplateById(Long id) {
        return wechatTemplateMapper.deleteWechatTemplateById(id);
    }

    /**
     * 根据id查询微信模板Dto
     */
    @Override
    public WechatTemplateTaskVO selectWechatTemplateDtoById(Long id) {
        // 初始化返回WechatTemplateTaskVO
        WechatTemplateTaskVO wechatTemplateTaskVO = new WechatTemplateTaskVO();
        // 根据id查询微信模板信息
        WechatTemplateVO vo = wechatTemplateMapper.selectWechatTemplateDtoById(id);
        // 将wechatTemplateVO赋值给wechatTemplateTaskVO
        BeanUtils.copyProperties(vo, wechatTemplateTaskVO);
        // 获取到suitTaskTypeIds并赋值给wechatTemplateTaskVO
        if (vo.getSuitTaskList() != null) {
            Long[] suitTaskTypeIds = vo.getSuitTaskList().stream().map(WechatTemplateSuitTask::getSuitTaskTypeId).toArray(Long[]::new);
            wechatTemplateTaskVO.setSuitTaskTypeIds(suitTaskTypeIds);
        }
        return wechatTemplateTaskVO;
    }
}
