package com.ruoyi.postCheck.service.impl;

import java.util.Date;
import java.util.List;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.ruoyi.common.constant.PostListEnum;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.postCheck.domain.PostCheckedItems;
import com.ruoyi.postCheck.service.IPostListInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Map;
import java.util.stream.Collectors;

import com.ruoyi.common.utils.StringUtils;
import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.postCheck.domain.PostListInfo;
import com.ruoyi.postCheck.mapper.PostListMapper;
import com.ruoyi.postCheck.domain.PostList;
import com.ruoyi.postCheck.service.IPostListService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.util.CollectionUtils;

/**
 * 岗检责任制清单Service业务层处理
 *
 * @author csg
 * @date 2023-12-20
 */
@Service
public class PostListServiceImpl extends ServiceImpl<PostListMapper, PostList> implements IPostListService {
    @Autowired
    private PostListMapper postListMapper;

    @Autowired
    private IPostListInfoService postListInfoService;

    /**
     * 查询岗检责任制清单
     *
     * @param id 岗检责任制清单主键
     * @return 岗检责任制清单
     */
    @Override
    public PostList selectPostListById(Long id) {
        PostList data = postListMapper.selectPostListById(id);
        if (data != null) {
            Long dataId = data.getId();
            PostListInfo info = new PostListInfo();
            info.setPostListId(dataId);
            List<PostListInfo> infoList = postListInfoService.selectPostListInfoList(info);
            data.setChildren(infoList);
        }
        return data;
    }

    /**
     * 查询岗检责任制清单列表
     *
     * @param postList 岗检责任制清单
     * @return 岗检责任制清单
     */
    @Override
    public List<PostList> selectPostListList(PostList postList) {
        List<PostList> postLists = postListMapper.selectPostListList(postList);

        //查询详情
        if (!CollectionUtils.isEmpty(postLists)) {
            List<Long> postListIds = postLists.stream().map(PostList::getId).collect(Collectors.toList());
            LambdaQueryWrapper<PostListInfo> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.in(PostListInfo::getPostListId, postListIds);
            queryWrapper.orderByAsc(PostListInfo::getId);
            List<PostListInfo> postListInfoList = postListInfoService.list(queryWrapper);
            //详情分组
            Map<Long, List<PostListInfo>> postListInfoListGroupMap = postListInfoList.stream().collect(Collectors.groupingBy(PostListInfo::getPostListId));
            //设置详情
            for (PostList data : postLists) {
                data.setChildren(postListInfoListGroupMap.get(data.getId()));
            }
        }

        return postLists;
    }

    /**
     * 新增岗检责任制清单
     *
     * @param postList 岗检责任制清单
     * @return 结果
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public int insertPostList(PostList postList) {
        //TODO 自增主键修改为-MyBatis-Plus雪花算法(截取5位解决VUE精度丢失BUG)-系统登录日志
//        if (postList.getId() == null)
            postList.setId(Long.parseLong(IdWorker.getIdStr().substring(4)));

        postList.setCreateDefault();
        postList.setCreationDate(new Date());//编制时间
        postList.setRevisionDate(new Date());//修订时间
        postList.setStatus(PostListEnum.STATUS_WAIT.getValue());//待审核

//        String isConfidential = postList.getIsConfidential();
//        System.out.println("isConfidential = " + isConfidential);

        int rows = postListMapper.insertPostList(postList);
        //新增责任制清单明细
        insertPostListInfo(postList);
        return rows;
    }

    /**
     * 修改岗检责任制清单
     *
     * @param postList 岗检责任制清单
     * @return 结果
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public int updatePostList(PostList postList) {
        postList.setUpdateDefault();
        //TODO 待改造，不可以将全部删除完，哪个部门修改了删除那个部门的，其他部门的不能删除。
        //删除明细
        postListMapper.deletePostListInfoByPostListId(postList.getId());
        //重新添加
        insertPostListInfo(postList);

        return postListMapper.updatePostList(postList);
    }

    /**
     * 批量删除岗检责任制清单
     *
     * @param ids 需要删除的岗检责任制清单主键
     * @return 结果
     */
    @Transactional
    @Override
    public int deletePostListByIds(Long[] ids) {
        postListMapper.deletePostListInfoByPostListIds(ids);
        return postListMapper.deletePostListByIds(ids);
    }

    /**
     * 删除岗检责任制清单信息
     *
     * @param id 岗检责任制清单主键
     * @return 结果
     */
    @Transactional
    @Override
    public int deletePostListById(Long id) {
        postListMapper.deletePostListInfoByPostListId(id);
        return postListMapper.deletePostListById(id);
    }

    /**
     * 新增岗检责任制清单明细信息
     *
     * @param postList 岗检责任制清单对象
     */
    public void insertPostListInfo(PostList postList) {
        List<PostListInfo> children = postList.getChildren();
        Long id = postList.getId();
        if (StringUtils.isNotNull(children)) {
            List<PostListInfo> list = new ArrayList<>();
            for (PostListInfo postListInfo : children) {
                //TODO 自增主键修改为-MyBatis-Plus雪花算法(截取5位解决VUE精度丢失BUG)-系统登录日志
//                if (postListInfo.getId() == null)
                    postListInfo.setId(Long.parseLong(IdWorker.getIdStr().substring(4)));

                postListInfo.setCreateDefault();
                postListInfo.setPostListId(id);

                postListInfo.setCreateUserId(SecurityUtils.getUserId());//创建者ID
                postListInfo.setStatus(PostListEnum.STATUS_WAIT.getValue());//状态，可能需要重新设计，五大部门按类型区分状态

                list.add(postListInfo);
            }
            if (list.size() > 0) {
                postListMapper.batchPostListInfo(list);
            }
        }
    }


    /**
     * @param deptId 部门ID
     * @param postId 岗位ID
     * @param type   检查项目（业务职责、党建党风、安全环保……）
     * @return
     */
    @Override
    public List<PostCheckedItems> contentListByType(Long deptId, Long postId, Integer type) {

        return postListMapper.contentListByType(deptId,postId,type);
    }
}
