package com.vctgo.system.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.vctgo.common.core.constant.UserConstants;
import com.vctgo.common.core.exception.ServiceException;
import com.vctgo.common.core.text.Convert;
import com.vctgo.common.core.utils.ServletUtils;
import com.vctgo.common.core.utils.StrUtils;
import com.vctgo.common.mybatisplus.constant.MybatisPageConstants;
import com.vctgo.common.security.utils.SecurityUtils;
import com.vctgo.system.api.domain.SysTenant;
import com.vctgo.system.domain.SysPost;
import com.vctgo.system.mapper.SysPostMapper;
import com.vctgo.system.mapper.SysTenantMapper;
import com.vctgo.system.mapper.SysUserPostMapper;
import com.vctgo.system.service.ISysPostService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 岗位信息 服务层处理
 *
 * @author vctgo
 */
@Slf4j
@Service
public class SysPostServiceImpl implements ISysPostService
{
    @Autowired
    private SysPostMapper postMapper;

    @Autowired
    private SysUserPostMapper userPostMapper;

    @Autowired
    private SysTenantMapper tenantMapper;

    /**
     * 查询岗位信息集合
     *
     * @param post 岗位信息
     * @return 岗位信息集合
     */
    @Override
    public IPage<SysPost> selectPostPage(SysPost post)
    {
        Page mpPage =new Page(Convert.toLong(ServletUtils.getParameterToInt(MybatisPageConstants.PAGE_NUM),1L)
                ,Convert.toLong(ServletUtils.getParameterToInt(MybatisPageConstants.PAGE_SIZE),10L));
        post.setTenantId(SecurityUtils.getTenantId());
        return postMapper.selectPostList(mpPage,post);
    }

    /**
     * 查询岗位信息集合
     *
     * @param post 岗位信息
     * @return 岗位信息集合
     */
    @Override
    public List<SysPost> selectPostList(SysPost post)
    {
        return postMapper.selectPostList(post);
    }

    /**
     * 查询所有岗位
     *
     * @return 岗位列表
     */
    @Override
    public List<SysPost> selectPostAll()
    {
        Long tenantId = SecurityUtils.getTenantId();
        if(tenantId == null){
            log.info("未检测到当前用户的所属租户信息");
            return Collections.emptyList();
        }
        SysTenant parentSysTenant = tenantMapper.getParentTenantInfo(tenantId);
        return parentSysTenant.getTenantType() == 3 ? postMapper.selectPostByPostSortAndTime(tenantId) : postMapper.selectPostAll(tenantId);
    }

    /**
     * 通过岗位ID查询岗位信息
     *
     * @param postId 岗位ID
     * @return 角色对象信息
     */
    @Override
    public SysPost selectPostById(Long postId)
    {
        return postMapper.selectPostById(postId);
    }

    /**
     * 根据用户ID获取岗位选择框列表
     *
     * @param userId 用户ID
     * @return 选中岗位ID列表
     */
    @Override
    public List<Long> selectPostListByUserId(Long userId)
    {
        return postMapper.selectPostListByUserId(userId);
    }

    /**
     * 校验岗位名称是否唯一
     *
     * @param post 岗位信息
     * @return 结果
     */
    @Override
    public boolean checkPostNameUnique(SysPost post)
    {
        Long postId = StrUtils.isNull(post.getPostId()) ? -1L : post.getPostId();
        Long tenantId = SecurityUtils.getTenantId();
        SysPost info = postMapper.checkPostNameUnique(post.getPostName(), tenantId);
        if (StrUtils.isNotNull(info) && info.getPostId().longValue() != postId.longValue())
        {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }

    /**
     * 校验岗位编码是否唯一
     *
     * @param post 岗位信息
     * @return 结果
     */
    @Override
    public boolean checkPostCodeUnique(SysPost post)
    {
        Long postId = StrUtils.isNull(post.getPostId()) ? -1L : post.getPostId();
        SysPost info = postMapper.checkPostCodeUnique(post.getPostCode());
        if (StrUtils.isNotNull(info) && info.getPostId().longValue() != postId.longValue())
        {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }

    /**
     * 创建系统默认岗位
     *
     * @param post 岗位信息
     * @return 结果
     */
    @Override
    public void createSysDefaultPost(SysPost post) {
        Long tenantId = post.getTenantId();
        List<SysPost> postList = new ArrayList<>(3);
        SysPost zbjsPost = new SysPost();
        SysPost pbjsPost = new SysPost();
        SysPost byyPost = new SysPost();
        zbjsPost.setPostCode("zbjs").setPostName("主班教师").setIsSysPost("Y").setPostSort("0");
        zbjsPost.setTenantId(tenantId);
        pbjsPost.setPostCode("pbjs").setPostName("配班教师").setIsSysPost("Y").setPostSort("0");
        pbjsPost.setTenantId(tenantId);
        byyPost.setPostCode("byy").setPostName("保育员").setIsSysPost("Y").setPostSort("0");
        byyPost.setTenantId(tenantId);
        postList.add(zbjsPost);
        postList.add(pbjsPost);
        postList.add(byyPost);
        postMapper.insertBatch(postList);
    }

    /**
     * 通过岗位ID查询岗位使用数量
     *
     * @param postId 岗位ID
     * @return 结果
     */
    @Override
    public int countUserPostById(Long postId)
    {
        return userPostMapper.countUserPostById(postId);
    }

    /**
     * 删除岗位信息
     *
     * @param postId 岗位ID
     * @return 结果
     */
    @Override
    public int deletePostById(Long postId)
    {
        return postMapper.deletePostById(postId);
    }

    /**
     * 批量删除岗位信息
     *
     * @param postIds 需要删除的岗位ID
     * @return 结果
     */
    @Override
    public int deletePostByIds(Long[] postIds)
    {
        for (Long postId : postIds)
        {
            SysPost post = selectPostById(postId);
            if ("0".equals(post.getStatus()))
            {
                throw new ServiceException(String.format("%1$s岗位已启用，不可删除", post.getPostName()));
            }
            if (countUserPostById(postId) > 0)
            {
                throw new ServiceException(String.format("%1$s岗位尚有人员绑定，不可删除", post.getPostName()));
            }
        }
        return postMapper.deletePostByIds(postIds);
    }

    /**
     * 新增保存岗位信息
     *
     * @param post 岗位信息
     * @return 结果
     */
    @Override
    public int insertPost(SysPost post)
    {
        return postMapper.insertPost(post);
    }

    /**
     * 修改保存岗位信息
     *
     * @param post 岗位信息
     * @return 结果
     */
    @Override
    public int updatePost(SysPost post)
    {
        return postMapper.updatePost(post);
    }

    /**
     * 变更幼儿园的岗位到所属集团
     *
     * @param gardenId 集团Id
     * @param id 幼儿园Id
     * @return 结果
     */
    @Override
    public int multiAdjustBranchPost(Long gardenId, Long id, Long tenantType) {
        return postMapper.multiAdjustBranchPost(gardenId, id, tenantType);
    }

    /**
     * 批量解除租户与岗位的绑定关系
     *
     * @param tenantId 租户Id
     * @return 结果
     */
    @Override
    public int deleteUserPostByTenantId(Long tenantId) {
        Long[] ids = {tenantId};
        return userPostMapper.deleteUserPostByTenantId(ids);
    }

    /**
     * 删除租户管理信息
     *
     * @param id 租户管理主键
     * @return 结果
     */
    @Override
    public int deleteSysDefaultPost(Long id)
    {
        Long[] ids = {id};
        return postMapper.deleteSysDefaultPost(ids);
    }
}
