package cn.ey.biz.module.system.service.user;

import cn.ey.biz.common.pojo.PageResult;
import cn.ey.biz.module.system.api.user.dto.AdminUserRespDTO;
import cn.ey.biz.module.system.api.user.dto.UsersForConditionsReqDTO;
import cn.ey.biz.module.system.api.user.dto.UsersForKeywordsReqDTO;
import cn.ey.biz.module.system.convert.user.UserConvert;
import cn.ey.biz.module.system.dal.dataobject.user.AdminUserDO;
import cn.ey.biz.module.system.dal.mapper.user.AdminUserMapper;
import cn.ey.biz.module.system.enums.user.OverseasStaffEnum;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.apache.commons.lang3.StringUtils;

import javax.annotation.Resource;

import static cn.ey.biz.common.exception.util.ServiceExceptionUtil.exception;
import static cn.ey.biz.module.system.enums.ErrorCodeConstants.USER_NOT_CONDITIONS;

/**
 * bean的实例由ElasticSearchConfiguration动态创建
 *
 */
public class AdminUserServiceDBImpl implements AdminUserSuperService{

    @Resource
    private AdminUserMapper userMapper;


    @Override
    public PageResult<AdminUserRespDTO> getUserForKeywords(UsersForKeywordsReqDTO userReqDTO) {

        LambdaQueryWrapper<AdminUserDO> wrapper = Wrappers.lambdaQuery(AdminUserDO.class)
                .and(checkKeywords(userReqDTO),
                        //模糊匹配gpn|email|名称
                        wp -> wp.or(userReqDTO.getIsLikeGPN(),wap->wap.like(AdminUserDO::getGpn,userReqDTO.getKeywords()))
                                //email
                                .or(userReqDTO.getIsLikeEmail(),wap->wap.like(AdminUserDO::getBusinessEmail,userReqDTO.getKeywords()))
                                //全称
                                .or(userReqDTO.getIsLikeUserName(),wap->wap.like(AdminUserDO::getDisplayName,userReqDTO.getKeywords()))
                )
                .eq(!userReqDTO.getIsOverseasStaff(),AdminUserDO::getIsOverseasStaff, OverseasStaffEnum.N.getCode())
                .in(CollUtil.isNotEmpty(userReqDTO.getLegalEntitys()),AdminUserDO::getLegalEntity,userReqDTO.getLegalEntitys())
                .in(CollUtil.isNotEmpty(userReqDTO.getRankCodes()),AdminUserDO::getRankCode, userReqDTO.getRankCodes())
                .notIn(CollUtil.isNotEmpty(userReqDTO.getExclusionRankCodes()),AdminUserDO::getRankCode,userReqDTO.getExclusionRankCodes())
                .eq(StringUtils.isNotBlank(userReqDTO.getCountry()),AdminUserDO::getCountry,userReqDTO.getCountry())
                .notIn(CollUtil.isNotEmpty(userReqDTO.getGeoRegions()),AdminUserDO::getGeoRegion,userReqDTO.getGeoRegions())
                .notIn(CollUtil.isNotEmpty(userReqDTO.getWorkLocation()),AdminUserDO::getWorkLocation,userReqDTO.getWorkLocation())
                .in(CollUtil.isNotEmpty(userReqDTO.getEmployeeStatus()),AdminUserDO::getEmployeeStatus,userReqDTO.getEmployeeStatus());
        return  UserConvert.INSTANCE.convertPage(userMapper.selectPage(userReqDTO,wrapper));
    }


    private boolean checkKeywords(UsersForKeywordsReqDTO userReqDTO){
        if(StringUtils.isNotBlank(userReqDTO.getKeywords()) &&
                (userReqDTO.getIsLikeGPN()||userReqDTO.getIsLikeEmail()||userReqDTO.getIsLikeUserName())){
            return true;
        }
        return false;
    }


    @Override
    public PageResult<AdminUserRespDTO> getUsersForConditions(UsersForConditionsReqDTO ucReqDTO) {
        if (BeanUtil.isEmpty(ucReqDTO, "pageNo", "pageSize")) {
            throw exception(USER_NOT_CONDITIONS);
        }
        LambdaQueryWrapper<AdminUserDO> wrapper = Wrappers.lambdaQuery(AdminUserDO.class)
                .eq(StringUtils.isNotBlank(ucReqDTO.getGpn()), AdminUserDO::getGpn, ucReqDTO.getGpn())
                .eq(!ucReqDTO.getIsOverseasStaff(),AdminUserDO::getIsOverseasStaff, OverseasStaffEnum.N.getCode())
                .in(CollUtil.isNotEmpty(ucReqDTO.getCitizenship()), AdminUserDO::getCitizenship, ucReqDTO.getCitizenship())
                .in(CollUtil.isNotEmpty(ucReqDTO.getSecondCitizenship()), AdminUserDO::getSecondCitizenship, ucReqDTO.getSecondCitizenship())
                .in(CollUtil.isNotEmpty(ucReqDTO.getEmployeeClass()), AdminUserDO::getEmployeeClass, ucReqDTO.getEmployeeClass())
                .in(CollUtil.isNotEmpty(ucReqDTO.getEmployeeStatus()), AdminUserDO::getEmployeeStatus, ucReqDTO.getEmployeeStatus())
                .in(CollUtil.isNotEmpty(ucReqDTO.getEmployeeType()), AdminUserDO::getEmployeeType, ucReqDTO.getEmployeeType())
                .in(CollUtil.isNotEmpty(ucReqDTO.getBaseLocation()), AdminUserDO::getBaseLocation, ucReqDTO.getBaseLocation())
                .in(CollUtil.isNotEmpty(ucReqDTO.getRankCode()), AdminUserDO::getRankCode, ucReqDTO.getRankCode())
                .in(CollUtil.isNotEmpty(ucReqDTO.getCountryOfBirth()), AdminUserDO::getCountryOfBirth, ucReqDTO.getCountryOfBirth())
                .in(CollUtil.isNotEmpty(ucReqDTO.getRegionOfBirth()), AdminUserDO::getRegionOfBirth, ucReqDTO.getRegionOfBirth())
                .in(CollUtil.isNotEmpty(ucReqDTO.getRegion()), AdminUserDO::getRegion, ucReqDTO.getRegion())
                .in(CollUtil.isNotEmpty(ucReqDTO.getCountry()), AdminUserDO::getCountry, ucReqDTO.getCountry())
                .in(CollUtil.isNotEmpty(ucReqDTO.getGeoRegion()), AdminUserDO::getGeoRegion, ucReqDTO.getGeoRegion())
                .in(CollUtil.isNotEmpty(ucReqDTO.getLegalEntity()), AdminUserDO::getLegalEntity, ucReqDTO.getLegalEntity())
                .in(CollUtil.isNotEmpty(ucReqDTO.getBranch()), AdminUserDO::getBranch, ucReqDTO.getBranch())
                .in(CollUtil.isNotEmpty(ucReqDTO.getBuesinessUnit()), AdminUserDO::getBuesinessUnit, ucReqDTO.getBuesinessUnit())
                .in(CollUtil.isNotEmpty(ucReqDTO.getMgmtRegion()), AdminUserDO::getMgmtRegion, ucReqDTO.getMgmtRegion())
                .in(CollUtil.isNotEmpty(ucReqDTO.getOperatingUnit()), AdminUserDO::getOperatingUnit, ucReqDTO.getOperatingUnit())
                .in(CollUtil.isNotEmpty(ucReqDTO.getMgmtUnit()), AdminUserDO::getMgmtUnit, ucReqDTO.getMgmtUnit())
                .in(CollUtil.isNotEmpty(ucReqDTO.getSubMgmtUnit()), AdminUserDO::getSubMgmtUnit, ucReqDTO.getSubMgmtUnit())
                .in(CollUtil.isNotEmpty(ucReqDTO.getCodeBlock()), AdminUserDO::getCodeBlock, ucReqDTO.getCodeBlock())
                .in(CollUtil.isNotEmpty(ucReqDTO.getServiceLine()), AdminUserDO::getServiceLine, ucReqDTO.getServiceLine())
                .in(CollUtil.isNotEmpty(ucReqDTO.getSubServiceLine()), AdminUserDO::getSubServiceLine, ucReqDTO.getSubServiceLine())
                .in(CollUtil.isNotEmpty(ucReqDTO.getWorkLocation()), AdminUserDO::getWorkLocation, ucReqDTO.getWorkLocation())
                .in(CollUtil.isNotEmpty(ucReqDTO.getSubLegalEntity()), AdminUserDO::getSubLegalEntity, ucReqDTO.getSubLegalEntity())
                .in(CollUtil.isNotEmpty(ucReqDTO.getStandardHours()), AdminUserDO::getStandardHours, ucReqDTO.getStandardHours())
                .in(CollUtil.isNotEmpty(ucReqDTO.getCompetency()), AdminUserDO::getCompetency, ucReqDTO.getCompetency())
                .in(CollUtil.isNotEmpty(ucReqDTO.getSupervisor()), AdminUserDO::getSupervisor, ucReqDTO.getSupervisor())
                .in(CollUtil.isNotEmpty(ucReqDTO.getGradeId()), AdminUserDO::getGradeId, ucReqDTO.getGradeId());
        return UserConvert.INSTANCE.convertPage(userMapper.selectPage(ucReqDTO, wrapper));
    }



}
