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 org.springframework.util.StringUtils;

/**
 * 流程结束监听器。
 * 在流程的最终节点，向当事学生发送处理结果的通知。 知无涯
 */
@Component
@Slf4j
public class StuInfoListener implements ExecutionListener {

    @Override
    public void notify(DelegateExecution delegateExecution) {
        // 1. 从流程变量中获取学生ID
        Object stuIdObj = delegateExecution.getVariable("stuId");

        // 安全检查：确保stuId存在且类型正确
        if (!(stuIdObj instanceof Long)) {
            log.error("流程实例 [{}] 在结束时未能获取到有效的 'stuId' 变量，无法发送最终通知。", delegateExecution.getProcessInstanceId());
            return;
        }
        Long stuId = (Long) stuIdObj;
        log.info("流程实例 [{}] 即将结束，准备向学生ID: {} 发送最终通知。", delegateExecution.getProcessInstanceId(), stuId);

        // 2. 向该学生发送企业微信通知
        try {
            DisciplinaryMapper disciplinaryMapper = SpringUtils.getBean(DisciplinaryMapper.class);

            // 根据学生ID查询其对应的企业微信账号(userName)
            String userName = disciplinaryMapper.getUserNameByUserId(stuId);

            // 检查是否找到了对应的企业微信账号
            if (!StringUtils.hasText(userName)) {
                log.warn("流程实例 [{}]: 根据学生ID '{}' 未找到对应的企业微信账号，无法发送最终通知。", delegateExecution.getProcessInstanceId(), stuId);
                return; // 中止发送逻辑
            }

            // 3. 构建并发送通知内容
            WeChatUtil weChatUtil = SpringUtils.getBean(WeChatUtil.class);
            String content = "您好，关于您的违纪处理流程已办结，最终结果已生成。<a href='http://zhxg.gxsdxy.cn/web/#/pages/Disciplinary/MyDisciplinary'>请点击登录系统查看详情</a>。";

            weChatUtil.sendTextMessage(userName, content);
            log.info("流程实例 [{}]: 已成功向学生ID '{}' (企业微信账号: {}) 发送了流程办结通知。", delegateExecution.getProcessInstanceId(), stuId, userName);

        } catch (Exception e) {
            // 即使通知失败，也不应影响流程的正常结束
            log.error("流程实例 [{}]: 在向学生ID '{}' 发送最终通知时出现异常。错误详情: {}",
                    delegateExecution.getProcessInstanceId(), stuId, e.getMessage(), e);
        }
    }
}