package com.srs.flowable.listener;

import com.srs.common.doman.vo.TeacherVo;
import com.srs.common.utils.DateUtils;
import com.srs.common.utils.WeChatUtil;
import com.srs.common.utils.spring.SpringUtils;
import com.srs.flowable.domain.NotificationManage;
import com.srs.flowable.domain.StuLeaveApplication;
import com.srs.flowable.mapper.LeaveMapper;
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.ExecutionListener;
import org.flowable.engine.delegate.TaskListener;
import org.flowable.task.service.delegate.DelegateTask;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.util.List;

/**
 * 获取该生所在二级学院领导信息
 */
@Component
@Slf4j
public class SecondaryLeaderListener implements ExecutionListener {

    @Override
    public void notify(DelegateExecution delegateExecution) {
        LeaveMapper leaveMapper = (LeaveMapper) SpringUtils.getBean("leaveMapper");

        String deptId = delegateExecution.getVariable("deptId").toString();

        // 辅导员审批结果
        String approval = delegateExecution.getVariable("approval").toString();

        // 获取请假天数
        BigDecimal leaveDays = (BigDecimal) delegateExecution.getVariable("leaveDays");

        // 获取二级学院书记用户信息
        //TeacherVo secondaryLeaderInfo = leaveMapper.getSecondaryLeaderInfo(deptId);
        //delegateExecution.setVariable("approval", secondaryLeaderInfo.getUserId());
        List<TeacherVo> secondaryLeaderInfo = leaveMapper.getSecondaryLeaderInfo(deptId);
        // 空数据防护：未查询到二级学院书记信息则跳过设置与通知
        if (secondaryLeaderInfo == null || secondaryLeaderInfo.isEmpty()) {
            log.warn("未找到二级学院书记信息，deptId={}，跳过审批人设置与通知。", deptId);
            return;
        }
        //由于这里查到了多个数据，由于时间原因，暂时还没有研究到工作流中多用户节点的同时进行(所以取了第一条数据用于发消息)
        delegateExecution.setVariable("approval", secondaryLeaderInfo.get(0).getUserId());

        // 获取请假申请ID
        String leaveApplicationId = delegateExecution.getVariable("leaveApplicationId").toString();
        // 获取请假信息
        StuLeaveApplication stuLeaveApplication = leaveMapper.selectRtStuLeaveApplicationByLeaveApplicationId(leaveApplicationId);

        // todo 企业微信推送消息（邵政文）
        log.info("查询二级学院书记信息：{}", secondaryLeaderInfo);
        try {
            //int leaveDay = leaveDays.intValue();
            // 步骤 2: 使用secondaryLeaderInfo.get(0).getUserName()获取二级学院书记工号
            String userName = secondaryLeaderInfo.get(0).getUserName();

            // 步骤 3: 检查是否成功获取到 userName
            if (userName != null && !userName.isEmpty()) {
                //查询指定用户的通知信息
                NotificationManage notificationManage = new NotificationManage();
                notificationManage.setContent("您有一条【请假人提交的请假申请】需待处理"); // 消息内容
                notificationManage.setReceiver(Long.parseLong(approval)); //接收人
                NotificationManage userManage = leaveMapper.selectCphMsgListForFlowable(notificationManage);
                if(userManage != null) {
                    //删除指定通知信息
                    int delRes = leaveMapper.deleteCphMsgById(userManage.getId());
                    log.info("删除成功{}", delRes);
                }

                //向多人发消息的逻辑如下：
//                notificationManage.setSender(Long.parseLong(approval)); // 发送人
//                notificationManage.setCreateTime(DateUtils.getNowDate()); // 创建时间
//                for(TeacherVo teacherVo : secondaryLeaderInfo) {
//                    //向系统发送通知
//                    notificationManage.setContent("您有一条【辅导员已提交请假审批】需待处理"); // 消息内容
//                    notificationManage.setReceiver(teacherVo.getUserId()); // 接收人
//                    NotificationManage userManages = leaveMapper.selectCphMsgListForFlowable(notificationManage);
//                    if (userManages == null) {
//                        int res = leaveMapper.insertCphMsg(notificationManage);
//                        log.info("添加成功{}", res);
//                    }
//
//                    // 获取向企业微信发通知的工具类
//                    WeChatUtil weChatUtil = SpringUtils.getBean(WeChatUtil.class);
//
//                    // 构造包含超链接的消息内容
//                    String content = "您有待处理任务，<a href='https://zhxg.gxsdxy.cn/wab/#/pages/Approval/index'>请点击前往处理</a>";
//
//                    // 步骤 4: 使用 userName 作为接收人发送消息
//                    //weChatUtil.sendTextMessage(userName, content);
//                    log.info("已成功向二级学院书记(userName:{})发送企业微信请假审批通知。", userName);
//                    log.info("已成功向送企业微信审批通知。{}", teacherVo.getUserId());
//                }

                //向系统发送通知
                notificationManage.setContent("您有一条【辅导员已提交请假审批】需待处理"); // 消息内容
                notificationManage.setSender(Long.parseLong(approval)); // 发送人
                notificationManage.setReceiver(secondaryLeaderInfo.get(0).getUserId()); // 接收人
                NotificationManage userManages = leaveMapper.selectCphMsgListForFlowable(notificationManage);
                if (userManages == null) {
                    notificationManage.setCreateTime(DateUtils.getNowDate());
                    int res = leaveMapper.insertCphMsg(notificationManage);
                    log.info("添加成功{}", res);
                }
                //新添地方
                notificationManage.setContent("您有一条【二级学院书记已提交请假申请审批】需待处理"); // 消息内容
                notificationManage.setReceiver(Long.parseLong(approval)); // 接收人
                NotificationManage userMsge = leaveMapper.selectCphMsgListForFlowable(notificationManage);
                if (userMsge != null) {
                    //删除指定通知信息
                    int delRes = leaveMapper.deleteCphMsgById(userMsge.getId());
                    log.info("删除成功{}", delRes);
                }

                // 获取向企业微信发通知的工具类
                WeChatUtil weChatUtil = SpringUtils.getBean(WeChatUtil.class);

                // 构造包含超链接的消息内容
                String content = "您有待处理任务，<a href='https://zhxg.gxsdxy.cn/wab/#/pages/Approval/index'>请点击前往处理</a>";

                // 步骤 4: 使用 userName 作为接收人发送消息
                weChatUtil.sendTextMessage(userName, content);
                log.info("已成功向二级学院书记(userName:{})发送企业微信请假审批通知。", userName);
                log.info("已成功向此人{}送企业微信审批通知。", secondaryLeaderInfo.get(0).getUserName());

            } else {
                // 如果找不到userName，记录警告日志，但流程继续
                log.warn("没有找到对应审批人，无法发送通知。");
            }
        } catch (Exception e) {
            // 捕获所有异常，仅记录日志，确保主流程不受影响
            log.error("发送企业微信通知时出现异常。错误详情: {}", e.getMessage(), e);
        }
    }
}
