package cn.iocoder.yudao.module.staff.service.impl;

import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.common.CommonErrorCodeConstants;
import cn.iocoder.yudao.module.staff.entity.CompanyStaff;
import cn.iocoder.yudao.module.staff.entity.CompanyStaffChange;
import cn.iocoder.yudao.module.staff.mapper.CompanyStaffChangeMapper;
import cn.iocoder.yudao.module.staff.service.CompanyStaffChangeService;
import cn.iocoder.yudao.module.staff.service.CompanyStaffService;
import cn.iocoder.yudao.module.staff.vo.CompanyStaffChangeReqVO;
import cn.iocoder.yudao.module.staff.vo.CompanyStaffChangeRespVO;
import com.baomidou.dynamic.datasource.annotation.DSTransactional;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

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

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;

/**
 * 企业管理-员工交接记录 接口实现类
 *
 * @author 小李
 * @date 15:40 2024/8/8
 **/
@Service
public class CompanyStaffChangeServiceImpl extends ServiceImpl<CompanyStaffChangeMapper, CompanyStaffChange> implements CompanyStaffChangeService {

    @Resource
    private CompanyStaffService staffService;

    /**
     * 创建交接记录
     *
     * @param staffChangeRespVO
     * @author 小李
     * @date 16:15 2024/8/8
     **/
    @Override
    @DSTransactional
    public void createChangeStaff(CompanyStaffChangeRespVO staffChangeRespVO) {
        // 确定交出方目前有没有工作可以交接
        Boolean flag = checkChangeStatus(staffChangeRespVO.getOldUserId());
        if (flag) {
            throw exception(CommonErrorCodeConstants.STAFF_CHANGE_CREATE_REPEAT);
        }
        baseMapper.insert(staffChangeRespVO);
        // TODO 交接工作记录待完成
    }

    /**
     * 交接记分页查询
     *
     * @param staffChangeReqVO 分页对象
     * @author 小李
     * @date 19:00 2024/8/12
     **/
    @Override
    public IPage<CompanyStaffChangeRespVO> getStaffChangePage(CompanyStaffChangeReqVO staffChangeReqVO, Page<CompanyStaffChange> page) {
        // 如果用户选择了按交接类型搜索（交出、接收），那一定要保证员工姓名、工号、电话有一个不为空才行，不然没有参照
        if (ObjectUtil.isNotEmpty(staffChangeReqVO.getChangeType()) &&
                (ObjectUtil.isNotEmpty(staffChangeReqVO.getName()) ||
                        ObjectUtil.isNotEmpty(staffChangeReqVO.getWorkNo()) ||
                        ObjectUtil.isNotEmpty(staffChangeReqVO.getTel())
                )
        ) {
            // 根据不为空的那个条件去查员工的userId
            List<CompanyStaff> list = null;
            if (ObjectUtil.isNotEmpty(staffChangeReqVO.getName())) {
                list = staffService.list(new LambdaQueryWrapper<CompanyStaff>()
                        .like(CompanyStaff::getName, staffChangeReqVO.getName())
                );
            } else if (ObjectUtil.isNotEmpty(staffChangeReqVO.getWorkNo())) {
                list = staffService.list(new LambdaQueryWrapper<CompanyStaff>()
                        .like(CompanyStaff::getWorkNo, staffChangeReqVO.getWorkNo())
                );
            } else if (ObjectUtil.isNotEmpty(staffChangeReqVO.getTel())) {
                list = staffService.list(new LambdaQueryWrapper<CompanyStaff>()
                        .like(CompanyStaff::getTel, staffChangeReqVO.getTel())
                );
            }
            // 如果查到了结果才处理，没查到不管
            if (ObjectUtil.isNotEmpty(list)) {
                List<Long> userIds = list.stream().map(item -> item.getUserId()).collect(Collectors.toList());
                if (staffChangeReqVO.getChangeType().equals("0")) {
                    staffChangeReqVO.setOldUserIds(userIds);
                } else {
                    staffChangeReqVO.setNewUserIds(userIds);
                }
            }
        }
        return baseMapper.getStaffChangePage(staffChangeReqVO, page);
    }

    /**
     * 判断交出方工作是否已交接
     *
     * @param userId 交出方ID
     * @author 小李
     * @date 18:02 2024/8/12
     **/
    @Override
    public Boolean checkChangeStatus(Long userId) {
        // 获取该员工的最新一条记录
        CompanyStaffChange staffChange = baseMapper.selectOne(new LambdaQueryWrapper<CompanyStaffChange>()
                .eq(CompanyStaffChange::getOldUserId, userId)
                .or()
                .eq(CompanyStaffChange::getNewUserId, userId)
                .orderByDesc(CompanyStaffChange::getCreateTime)
                .last("limit 1")
        );
        // 如果为空或者最后一次相关记录他是交出方，那就返回true，代表他交接了工作没有工作可以交
        return ObjectUtil.isNotEmpty(staffChange) && staffChange.getOldUserId().equals(userId);
    }
}
