package com.srs.flowable.listener.disciplinary;

import com.srs.common.utils.WeChatUtil;
import com.srs.common.utils.spring.SpringUtils;
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.stereotype.Component;
import java.util.List;

/**
 * 为“学生教育管理科审核”节点做准备。 知无涯
 * 1. 向该候选组的所有成员发送企业微信通知。
 * 2. 将该组的所有成员ID列表存入 'userList' 流程变量，供下游监听器(GenericMessageListener)使用。
 */
@Component("xsjyglkListener")
@Slf4j
public class XSJYGLKListener implements ExecutionListener {

    @Override
    public void notify(DelegateExecution delegateExecution) {
        DisciplinaryMapper disciplinaryMapper = SpringUtils.getBean(DisciplinaryMapper.class);

        // 1. 【核心】定义“学生教育管理科”角色Key
        final String TARGET_ROLE_KEY = "xsjyglksh";
        log.info("流程实例 [{}]: 触发XSJYGLKListener, 准备向角色 '{}' 发送通知并设置流程变量。", delegateExecution.getProcessInstanceId(), TARGET_ROLE_KEY);

        // 2. 根据角色Key，查询该角色的所有成员ID。
        //    这个查询结果既用于发送企微，也用于设置流程变量。
        List<Long> userIdList = disciplinaryMapper.getApprovalByRoleKey(TARGET_ROLE_KEY);

        // 3. 检查是否找到了成员。
        if (userIdList == null || userIdList.isEmpty()) {
            log.error("根据角色Key '{}' 未找到任何用户，无法发送通知和设置变量。", TARGET_ROLE_KEY);
            return; // 中止执行
        }

        // --- 关键新增逻辑：开始 ---
        // 4. 将查询到的用户ID列表存入流程变量 'userList'。
        //    这是为下游的 GenericMessageListener 准备的标准“产品”。
        delegateExecution.setVariable("userList", userIdList);
        log.info("已将角色 '{}' 的 {} 位成员ID存入 'userList' 流程变量，供下游监听器使用。", TARGET_ROLE_KEY, userIdList.size());
        // --- 关键新增逻辑：结束 ---

        // 5. (原有逻辑) 发送企业微信通知。
        sendWeChatNotification(userIdList, disciplinaryMapper, TARGET_ROLE_KEY);
    }

    /**
     * 封装的发送企业微信的私有方法，保持主方法 notify 的整洁。
     */
    private void sendWeChatNotification(List<Long> userIdList, DisciplinaryMapper disciplinaryMapper, String roleKey) {
        try {
            List<String> userNameList = disciplinaryMapper.getUserNamesByUserIdList(userIdList);

            if (userNameList != null && !userNameList.isEmpty()) {
                String toUser = String.join("|", userNameList);

                WeChatUtil weChatUtil = SpringUtils.getBean(WeChatUtil.class);
                String content = "您有一条新的学生违纪审批任务待处理，<a href='https://zhxg.gxsdxy.cn/wab/#/pages/Approval/index'>请点击前往处理</a>。";

                weChatUtil.sendTextMessage(toUser, content);
                log.info("已成功向角色 '{}' 的成员发送企业微信通知。接收人: {}", roleKey, toUser);
            } else {
                log.warn("角色 '{}' 中找到了 {} 个用户，但无人配置企业微信账号，未发送任何通知。", roleKey, userIdList.size());
            }
        } catch (Exception e) {
            log.error("向角色 '{}' 发送企业微信通知时出现异常。流程将继续。错误详情: {}", roleKey, e.getMessage(), e);
        }
    }
}
