package com.njcn.supervision.utils;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.text.StrPool;
import cn.hutool.core.util.StrUtil;
import com.njcn.bpm.enums.BpmTaskStatusEnum;
import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.supervision.enums.SupervisionResponseEnum;
import com.njcn.web.utils.RequestUtil;

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

/**
 * 处理流程实例的工具类
 * @author hongawen
 */
public class InstanceUtil {

    /**
     * 处理历史流程实例的id
     *
     * @param lastId     最近一次流程实例id
     * @param historyIds 之前历史id列表
     * @return 最新的历史id列表
     */
    public static String dealHistoryId(String lastId, String historyIds) {
        if (StrUtil.isBlank(historyIds)) {
            return lastId;
        }
        return historyIds.concat(StrPool.COMMA).concat(lastId);
    }

    /**
     * 判断用户是否有权限操作
     *
     * @param userId   当前用户id
     * @param createBy 数据创建用户id
     */
    public static void judgeUserPower(String userId, String createBy) {
        if (!userId.equalsIgnoreCase(createBy)) {
            throw new BusinessException(SupervisionResponseEnum.NO_POWER);
        }
    }

    /**
     * 判断用户是否有权限操作
     *
     * @param deptId            当前用户部门id
     * @param responsibleDeptId 数据创建负责单位id
     */
    public static void judgeUserDeptPower(String deptId, String responsibleDeptId) {
        if (!deptId.equalsIgnoreCase(responsibleDeptId)) {
            throw new BusinessException(SupervisionResponseEnum.NO_DEPT_POWER);
        }

    }

    /**
     * 判断用户是否有删除管理员权限操作
     *
     * @param userId   当前用户部门id
     * @param createBy 数据创建负责单位id
     */
    public static void deleteRole(String userId, List<String> createBy, Long statusCount) {
        if (CollUtil.isEmpty(createBy)) {
            throw new BusinessException(SupervisionResponseEnum.EXISTENCE_OR_NOT);
        }
        //先判断是否是删除管理员，如果是就有全部删除权限，否则就只能删除带提交审批的
        List<String> delete = deleteUser();
        //如果为空则需要判断信息，先判断全部数据是否都是自己创建的，然后判断是否是都是带提交数据
        if (CollUtil.isEmpty(delete)) {
            long count = createBy.stream().filter(x -> !userId.equals(x)).count();
            if (count > 0) {
                throw new BusinessException(SupervisionResponseEnum.NO_POWER);
            } else {
                if (statusCount > 0) {
                    throw new BusinessException(SupervisionResponseEnum.DELETE_TO_BE_SUBMITTED);
                }
            }
        }
    }

    //过滤子集部门对象权限
    public static List<Integer> filterTaskStatus() {
        List<Integer> info =new ArrayList<>();
        info.add(BpmTaskStatusEnum.RUNNING.getStatus());
        info.add(BpmTaskStatusEnum.APPROVE.getStatus());
        List<String> delete = deleteUser();
        //删除管理员默认能删除全部数据
        if (CollUtil.isNotEmpty(delete)) {
            info.clear();
        }
        return info;
    }

    public static List<Integer> filterTempLineTaskStatus() {
        List<Integer> info =new ArrayList<>();
        info.add(BpmTaskStatusEnum.RUNNING.getStatus());
        info.add(BpmTaskStatusEnum.APPROVE.getStatus());
        info.add(BpmTaskStatusEnum.RETURN.getStatus());
        List<String> delete = deleteUser();
        //删除管理员默认能删除全部数据
        if (CollUtil.isNotEmpty(delete)) {
            info.clear();
        }
        return info;
    }

    private static List<String> deleteUser() {
        String userRole = RequestUtil.getUserRole();
        String trimmedString = userRole.substring(1, userRole.length() - 1).replace("\"", "");
        List<String> list = Arrays.asList(trimmedString.split(","));
        return list.stream().filter(x -> "delete_info".equals(x)).collect(Collectors.toList());
    }

}