package com.jeeplus.modules.flowable.listener;

import cn.hutool.extra.spring.SpringUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.jeeplus.extension.domain.FlowCopy;
import com.jeeplus.extension.service.FlowCopyService;
import com.jeeplus.flowable.model.ActRuTaskInfo;
import com.jeeplus.flowable.model.Flow;
import com.jeeplus.flowable.service.FlowTaskService;
import com.jeeplus.flowable.service.MyNoticeService;
import com.jeeplus.flowable.utils.StringUtils;
import com.jeeplus.sys.feign.IOfficeApi;
import com.jeeplus.sys.feign.IRoleApi;
import com.jeeplus.sys.feign.IUserApi;
import com.jeeplus.sys.service.dto.OfficeDTO;
import com.jeeplus.sys.service.dto.RoleDTO;
import com.jeeplus.sys.service.dto.UserDTO;
import lombok.SneakyThrows;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.ExecutionListener;
import org.flowable.engine.runtime.ProcessInstance;
import org.springframework.stereotype.Component;


import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

@Component("JyProjectArchiveListener")
public class JyProjectArchiveListener implements ExecutionListener {

    @SneakyThrows
    public void notify(DelegateExecution delegateExecution) {
        String eventName = delegateExecution.getEventName ( );
        System.out.println("--------- delegateExecution -----------" + delegateExecution);

        if ( "start".equals ( eventName ) ) {
            System.out.println ( "start=========" );
        } else if ( "end".equals ( eventName ) ) {
            //根据这里的 delegateExecution的id去act_ru_task表中查该流程的数据 对应表中的EXECUTION_ID_
            ActRuTaskInfo task = SpringUtil.getBean(MyNoticeService.class).getTaskInfoByID(delegateExecution.getId());

            if (null != task) {
                List<Flow> flows = SpringUtil.getBean(FlowTaskService.class).historicTaskList(task.getProcInstId());
                //根据PROC_DEF_ID_去act_re_deployment中查询流程的名称
                String substring = task.getProcDefId().substring(0, task.getProcDefId().indexOf(":"));
                String actName = SpringUtil.getBean(FlowTaskService.class).getActNameByDefId(substring);

                String titleName = "";
                // 根据流程定义ID查询流程实例
                ProcessInstance processInstance = SpringUtil.getBean(RuntimeService.class).createProcessInstanceQuery()
                        .processInstanceId(task.getProcInstId())
                        .singleResult();

                if (processInstance != null) {
                    // 获取流程实例标题变量名（假设标题存储在名为"title"的变量中）
                    String titleVariableName = "title";

                    // 查询流程实例的标题变量
                    Object title = SpringUtil.getBean(RuntimeService.class).getVariable(processInstance.getId(), titleVariableName);

                    if (title != null) {
                        titleName = title.toString();
                    } else {
                        // 如果标题变量不存在或者没有值，可以返回默认标题
                        titleName = "";
                    }
                }
                Flow flow = new Flow();
                for (int i=0;i<flows.size();i++){
                    if (flows.get(i).getComment().getMessage().equals("发起流程")){
                        flow = flows.get(i);
                    }
                }

                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                //用于存放被抄送人
                ArrayList<UserDTO> list = new ArrayList<>();
                //创建人
                UserDTO userDTO = SpringUtil.getBean(IUserApi.class).getById(flow.getAssigneeId());
                //获取嘉溢所有人员信息
                List<UserDTO> allUserInfo = SpringUtil.getBean(IUserApi.class).findListByCompanyId(userDTO.getCompanyDTO().getId());
                String finalTitleName = titleName;
                //获取市场部下的所有员工信息
                OfficeDTO officeDTO = SpringUtil.getBean(IOfficeApi.class).getOfficeDTOByName("市场部");
                List<UserDTO> listByOfficeId = SpringUtil.getBean(IUserApi.class).findListByOfficeId(officeDTO.getId());
                for (UserDTO dto : listByOfficeId) {
                    list.add(dto);
                }
                //获取总经理
                RoleDTO roleDTO = SpringUtil.getBean(IRoleApi.class).getRoleDTOByName("总经理");
                List<UserDTO> listByRoleId = SpringUtil.getBean(IUserApi.class).findListByRoleId(roleDTO.getId());
                for (UserDTO dto : listByRoleId) {
                    list.add(dto);
                }
                //将项目信息抄送给分管领导
                for (UserDTO dto : allUserInfo) {
                    //分管领导
                    if (StringUtils.isNotBlank(dto.getManageOfficeIds())){
                        String manageOfficeIds = dto.getManageOfficeIds();
                        if (manageOfficeIds.contains(",")){
                            String[] split = manageOfficeIds.split(",");
                            //获取分管领导所分管的部门
                            for (String s : split) {
                                //判断分管部门与项目创建人所在的部门是否一致
                                if (s.equals(userDTO.getOfficeDTO().getId())) {
                                    list.add(dto);
                                }
                            }
                        }else {
                            if (manageOfficeIds.equals(userDTO.getOfficeDTO().getId())) {
                                list.add(dto);
                            }
                        }
                    }
                }
                //将集合中的人员发送抄送信息
                for (UserDTO user : list) {
                    FlowCopy flowCopy = new FlowCopy();
                    flowCopy.setProcDefId(task.getProcDefId());
                    flowCopy.setProcInsName(finalTitleName);
                    flowCopy.setProcInsId(task.getProcInstId());
                    flowCopy.setUserId(user.getId());
                    //将项目信息进行抄送
                    SpringUtil.getBean(FlowCopyService.class).save(flowCopy);
                }


            }

            System.out.println ( "end=========" );
        } else if ( "take".equals ( eventName ) ) {//连线监听
            System.out.println ( "take=========" );
        }
    }
}
