package com.codvision.workflow.listener.task;

import com.codvision.auth.entity.SysUser;
import com.codvision.auth.service.ISysUserService;
import com.codvision.auth.service.third.GovDingService;
import com.codvision.workflow.service.WorkFlowService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.flowable.task.service.delegate.DelegateTask;
import org.springframework.stereotype.Component;

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

/**
 * 普通钉钉、浙政钉消息通知
 * @author hxl
 */
@Slf4j
@RequiredArgsConstructor
@Component(value = "workFlowDingMsgNoticeListener")
public class WorkFlowDingMsgNoticeListener {

    private final GovDingService govDingService;
    private final ISysUserService sysUserService;
    private final WorkFlowService workFlowService;

    /**
     * 浙政钉文本消息（工作通知消息 事件类型 -> create）
     * @param delegateTask 当前任务
     * @param receiverIds 接收人用户ID(accountId)，若未指定消息接收人，则默认发送消息给当前节点的所有用户
     * @param content 消息内容
     */
    public void sendGovTextMsg(DelegateTask delegateTask, String receiverIds, String content) {
        if (StringUtils.isBlank(content)) {
            return;
        }

        // 若未指定消息接收人，则默认发送消息给当前节点的所有用户
        receiverIds = StringUtils.isBlank(receiverIds) ? getReceiverIds(delegateTask.getId()) : receiverIds;
        if (StringUtils.isBlank(receiverIds)) {
            return;
        }

        try {
            govDingService.sendTextMsg(receiverIds, content);
        } catch (Exception e) {
            log.error(e.getMessage());
        }
    }

    /**
     * 浙政钉链接消息（工作通知消息 事件类型 -> create）
     * @param delegateTask 当前任务
     * @param receiverIds 接收人用户ID(accountId)，若未指定消息接收人，则默认发送消息给当前节点的所有用户
     * @param title 消息标题
     * @param text 消息描述
     * @param messageUrl 消息点击链接地址，当发送消息为小程序时支持小程序跳转链接
     * @param picUrl 图片地址
     */
    public void sendGovLinkMsg(DelegateTask delegateTask, String receiverIds, String title, String text, String messageUrl, String picUrl) {
        if (StringUtils.isBlank(title) || StringUtils.isBlank(text) || StringUtils.isBlank(messageUrl) || StringUtils.isBlank(picUrl)) {
            return;
        }

        // 若未指定消息接收人，则默认发送消息给当前节点的所有用户
        receiverIds = StringUtils.isBlank(receiverIds) ? getReceiverIds(delegateTask.getId()) : receiverIds;
        if (StringUtils.isBlank(receiverIds)) {
            return;
        }

        try {
            govDingService.sendLinkMsg(receiverIds, title, text, messageUrl, picUrl);
        } catch (Exception e) {
            log.error(e.getMessage());
        }
    }

    /**
     * 浙政钉MarkDown消息（工作通知消息 事件类型 -> create）
     * @param delegateTask 当前任务
     * @param receiverIds 接收人用户ID(accountId)，若未指定消息接收人，则默认发送消息给当前节点的所有用户
     * @param title 标题
     * @param text markdown的文本
     */
    public void sendGovMarkDownMsg(DelegateTask delegateTask, String receiverIds, String title, String text) {
        if (StringUtils.isBlank(title) || StringUtils.isBlank(text)) {
            return;
        }

        // 若未指定消息接收人，则默认发送消息给当前节点的所有用户
        receiverIds = StringUtils.isBlank(receiverIds) ? getReceiverIds(delegateTask.getId()) : receiverIds;
        if (StringUtils.isBlank(receiverIds)) {
            return;
        }

        try {
            govDingService.sendMarkDownMsg(receiverIds, title, text);
        } catch (Exception e) {
            log.error(e.getMessage());
        }
    }


    private String getReceiverIds(String taskId) {
        List<Integer> taskRelatedUserIds = workFlowService.getTaskRelatedUserIds(taskId);
        if (CollectionUtils.isEmpty(taskRelatedUserIds)) {
            return null;
        }

        List<SysUser> sysUsers = sysUserService.listByIds(taskRelatedUserIds);
        if (CollectionUtils.isEmpty(sysUsers)) {
            return null;
        }

        return sysUsers.stream().map(SysUser::getZzdId)
                .filter(StringUtils::isNotBlank).distinct().collect(Collectors.joining(","));
    }
}
