package cn.axzo.workflow.core.deletage;

import cn.axzo.maokai.api.client.OrganizationalNodeUserApi;
import cn.axzo.maokai.api.vo.request.FlowTaskAssignerReq;
import cn.axzo.maokai.api.vo.request.FlowTaskAssignerReq.IdentityPair;
import cn.axzo.maokai.api.vo.response.FlowTaskAssigner;
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.core.deletage.approverscope.ApproverScopeDTO;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import lombok.extern.slf4j.Slf4j;
import org.flowable.bpmn.model.UserTask;
import org.flowable.engine.delegate.DelegateExecution;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

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

import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;

/**
 * 基于"发起人主管"查询审批人
 *
 * @author wangli
 * @since 2023/11/16 11:41
 */
@Slf4j
@Component
public class InitiatorLeaderTaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {

    @Autowired
    private OrganizationalNodeUserApi organizationalNodeUserApi;

    @Override
    public boolean support(String param) {
        return ApproverSpecifyEnum.initiatorLeader.getType().equals(param);
    }

    @Override
    protected List<BpmnTaskDelegateAssigner> invokeService(UserTask userTask, DelegateExecution execution,
                                                           ApproverScopeDTO scopeDto) {
        // 获取发起人
        BpmnTaskDelegateAssigner initiator =
                (BpmnTaskDelegateAssigner) execution.getVariables().getOrDefault(INTERNAL_INITIATOR, null);
        if (Objects.isNull(initiator)) {
            return super.invokeService(userTask, execution, scopeDto);
        }
        FlowTaskAssignerReq req = FlowTaskAssignerReq.builder()
                .orgScopes(scopeDto.getOrgScopes().stream()
                        .map(o -> FlowTaskAssignerReq.OrgScope.builder()
                                .ouId(o.getOuId())
                                .workspaceId(o.getWorkspaceId())
                                .build())
                        .collect(Collectors.toList()))
                .sponsor(IdentityPair.builder()
                        .identityId(Long.valueOf(initiator.getAssignee()))
                        .identityType(Integer.valueOf(initiator.getAssigneeType())).build())
                .build();

        List<FlowTaskAssigner> flowTaskAssigners =
                parseApiResult(() -> organizationalNodeUserApi.listFlowTaskAssigner(req), "通过发起人主管查询审批人", req);

        if (CollUtil.isEmpty(flowTaskAssigners)) {
            return Collections.emptyList();
        }
        return BeanUtil.copyToList(flowTaskAssigners, BpmnTaskDelegateAssigner.class);
    }
}
