package com.srs.flowable.listener.disciplinary;

import com.srs.common.utils.WeChatUtil;
import com.srs.flowable.mapper.DisciplinaryMapper;
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.ExecutionListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 【线上监听器】为“学院违纪处理委员会”多实例任务准备数据并发送通知  知无涯
 */
@Component("xywjclwyhListener")
@Slf4j
public class XYWJCLWYHListener implements ExecutionListener {

    // 推荐：使用依赖注入，而不是SpringUtils
    @Autowired
    private DisciplinaryMapper disciplinaryMapper;

    @Autowired
    private WeChatUtil weChatUtil;

    @Override
    public void notify(DelegateExecution execution) {
        log.info("流程实例 [{}]: 在进入'学院违纪处理委员会'节点前，开始准备审批数据...", execution.getProcessInstanceId());

        // 步骤 1: 单一数据库查询，获取所有需要的审批人信息 (ID和企微账号)
        // List<DisciplinaryMapper.UserInfo> userInfos = disciplinaryMapper.getUserInfoByRoleKey("xywjclwyh");
        // 注意：如果您不方便修改Mapper，这里可以保持原来的两次查询，逻辑依然正确。
        // 我们先用原始的两次查询来演示，更具普适性。

        List<Long> userIdList = disciplinaryMapper.getApprovalByRoleKey("xywjclwyh");

        if (userIdList == null || userIdList.isEmpty()) {
            log.error("角色 'xywjclwyh' 未配置或未找到任何有效用户，流程无法继续。");
            throw new RuntimeException("学院违纪处理委员会审批人员未设置");
        }

        // 步骤 2: 设置多实例任务需要的流程变量 (这是“线上”为“节点”准备的核心数据)
        execution.setVariable("userList", userIdList);
        log.info("流程实例 [{}]: 已成功设置'userList'变量，包含 {} 个审批人。", execution.getProcessInstanceId(), userIdList.size());

        // 步骤 3: 发送企业微信通知
        sendWeChatNotification(userIdList, execution.getProcessInstanceId());
    }

    /**
     * 封装并执行企业微信通知逻辑
     */
    private void sendWeChatNotification(List<Long> userIdList, String processInstanceId) {
        try {
            List<String> userNameList = disciplinaryMapper.getUserNamesByUserIdList(userIdList);
            if (userNameList == null || userNameList.isEmpty()) {
                log.warn("流程实例 [{}]: 角色'xywjclwyh'存在审批人ID，但无人配置企微账号，未发送通知。", processInstanceId);
                return;
            }

            String toUser = String.join("|", userNameList);
            String content = "您有一条新的学生违纪审批任务待处理，<a href='http://zhxg.gxsdxy.cn/web/#/pages/Approval/index'>请点击前往处理</a>。";

            weChatUtil.sendTextMessage(toUser, content);
            log.info("流程实例 [{}]: 已成功向学院违纪处理委员会发送通知。接收人: {}", processInstanceId, toUser);
        } catch (Exception e) {
            log.error("流程实例 [{}]: 发送企微通知时出现异常，但不影响主流程。错误: {}", processInstanceId, e.getMessage(), e);
        }
    }
}