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;

/**
 * 执行监听器：在“申请人（辅导员）接收”节点开始时， 知无涯
 * 向流程发起人发送企业微信通知，告知其结果已出。
 */
@Component
@Slf4j
public class InitiatorResultListener implements ExecutionListener {

    @Override
    public void notify(DelegateExecution delegateExecution) {
        log.info("流程实例 [{}]: 已进入辅导员接收结果节点，准备向发起人发送通知。", delegateExecution.getProcessInstanceId());

        try {
            DisciplinaryMapper disciplinaryMapper = SpringUtils.getBean(DisciplinaryMapper.class);

            // 1. 从流程变量中获取发起人的ID。Flowable会自动将发起人ID存入名为 "INITIATOR" 的变量中。
            //    这个变量通常是 String 类型。
            Object initiatorObj = delegateExecution.getVariable("INITIATOR");
            if (initiatorObj == null) {
                log.warn("在流程实例 [{}] 中未找到发起人(INITIATOR)变量，无法发送通知。", delegateExecution.getProcessInstanceId());
                return;
            }

            // 2. 将发起人ID转换为 Long 类型，以便查询数据库
            Long initiatorUserId;
            try {
                initiatorUserId = Long.parseLong(initiatorObj.toString());
            } catch (NumberFormatException e) {
                log.error("发起人(INITIATOR)变量 '{}' 无法转换为Long类型，无法发送通知。", initiatorObj);
                return;
            }

            // 3. 使用 initiatorUserId 查询对应的企业微信 userName
            String initiatorUserName = disciplinaryMapper.getUserNameByUserId(initiatorUserId);

            if (initiatorUserName != null && !initiatorUserName.isEmpty()) {
                // 4. 发送通知
                WeChatUtil weChatUtil = SpringUtils.getBean(WeChatUtil.class);
                String content = "您提交的学生违纪处分申请已有最终处理结果，<a href='https://zhxg.gxsdxy.cn/wab/#/pages/Approval/index'>请点击前往处理</a>。\"";

                weChatUtil.sendTextMessage(initiatorUserName, content);
                log.info("已成功向流程发起人 ({}) 发送结果通知。", initiatorUserName);
            } else {
                log.warn("找到了发起人(userId:{})，但其对应的企业微信账号(userName)为空，未发送通知。", initiatorUserId);
            }

        } catch (Exception e) {
            log.error("向流程发起人发送结果通知时出现异常。流程将继续。错误详情: {}", e.getMessage(), e);
        }
    }
}
