package com.zd.system.service.impl;

import cn.hutool.core.collection.CollUtil;
import com.zd.common.core.domain.R;
import com.zd.common.datascope.annotation.DataScope;
import com.zd.system.api.domain.SysDept;
import com.zd.system.api.domain.SysUser;
import com.zd.system.api.laboratory.RemoteLaboratoryService;
import com.zd.system.api.laboratory.domain.TotalByID;
import com.zd.system.api.model.SysDeptListVO;
import com.zd.system.mapper.SysDeptMapper;
import com.zd.system.mapper.SysUserMapper;
import com.zd.system.service.ISysDeptService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @Author: zhoupan
 * @Date: 2021/09/29/9:32
 * @Description:
 */
@Service
public class SysDeptManager {


    @Autowired
    ISysDeptService sysDeptService;
    @Autowired
    private SysDeptMapper deptMapper;

    @Autowired
    SysUserMapper sysUserMapper;

    @Autowired
    RemoteLaboratoryService remoteLaboratoryService;

//    @DataScope(deptAlias = "d")
    @Deprecated
    public List<SysDeptListVO> querySysDeptListVO(SysDept dept) {

        List<SysDept> depts = deptMapper.selectDeptList(dept);

        //组合人数、实验室数量信息

        return joinDetailCount(depts);
    }

    /**
     * 关联细节信息
     *
     * @param sysDepts
     * @return
     */
    private List<SysDeptListVO> joinDetailCount(List<SysDept> sysDepts) {
        if (CollUtil.isEmpty(sysDepts)) return Collections.emptyList();
        //当前是规定了二级组织机构为院系，三级为楼栋，并且实验室同时
        //所以该方法只适用于此种情况
        //并且不涉及数据权限，如果通过部分数据权限，可能会不准确
        //1 获取人数
        //按理楼下面是不挂人的，人应该挂到院系
        //2 获取实验室
        //因为现在楼栋和组织机构没有分开，并且在实验室使用两个字段存储（组织机构中院系和楼栋关系的改变会导致，实验室中院系与楼栋关系的不一致）
        //所以获取也分两种
        //2.1 查楼栋下的实验是

        //2.2 查院系下的实验室

        //3 组合对应数量到楼栋和院系
        //4 计算根节点的数量 ， 根节点的数量是院系数量之和
        //4.1 人员之和和实验室之和计算不一样 ，人员是下级加上自己的等于自己总的
        //4.2 实验室里院系不能加下级，因为下级是楼，院系的数量已经包括楼了，但是楼之上的节点需要求总


        //5 算球 ，直接交给前端计算 ，我只给出每个节点的数据（院系不找实验室数量，只要楼栋的实验室就可以解决这个问题） 这样最简单
        //存在的问题，如果数据权限不可见”楼栋“则没有实验室数量
        //5.1 查询本级人数
        Long[] longs = sysDepts.stream().map(a -> a.getDeptId()).toArray(Long[]::new);
        List<TotalByID> maps = sysUserMapper.queryCountByDeptIds(longs);
        //5.2 查询实验室数
        R<List<TotalByID>> listR = remoteLaboratoryService.queryBuildingSubTotal(longs);
        final Map<Long, Long> mapPeopleTotal = new HashMap<>(listR.getData() == null ? 0 : listR.getData().size());

        final Map<Long, Long> mapSubTotal = new HashMap<>(listR.getData() == null ? 0 : listR.getData().size());
        if (CollUtil.isNotEmpty(listR.getData())) {
            listR.getData().forEach(a -> {
                mapSubTotal.put(a.getId(), a.getTotal());
            });
        }
        if (CollUtil.isNotEmpty(maps)) {
            maps.forEach(a -> {
                mapPeopleTotal.put(a.getId(), a.getTotal());
            });
        }
        return sysDepts.stream().map(a -> {
            SysDeptListVO sysDeptListVO = new SysDeptListVO();
            BeanUtils.copyProperties(a, sysDeptListVO);
            sysDeptListVO.setTotalPeople(Optional.ofNullable(mapPeopleTotal.get(a.getDeptId())).orElse(0L));
            sysDeptListVO.setTotalSub(Optional.ofNullable(mapSubTotal.get(a.getDeptId())).orElse(0L));
            return sysDeptListVO;
        }).collect(Collectors.toList());

    }

}
