package cn.iocoder.yudao.module.system.dal.mysql.hr;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.hr.vo.payslip.PayslipPageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
import cn.iocoder.yudao.module.system.dal.dataobject.hr.PayslipDO;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Objects;

@Mapper
public interface PayslipMapper extends BaseMapperX<PayslipDO> {

    default PageResult<PayslipDO> selectPage(PayslipPageReqVO pageReqVO) {

        MPJLambdaWrapperX<PayslipDO> wrapper = new MPJLambdaWrapperX<PayslipDO>()
                .selectAll(PayslipDO.class)
                .selectAs(AdminUserDO::getNickname, PayslipDO::getUserName)
                .selectAs(DeptDO::getName, PayslipDO::getDeptName);
        wrapper.innerJoin(AdminUserDO.class, on -> on
                .eq(AdminUserDO::getId, PayslipDO::getUserId)
                .like(Objects.nonNull(pageReqVO.getName()), AdminUserDO::getNickname, pageReqVO.getName()));
        wrapper.innerJoin(DeptDO.class, DeptDO::getId, PayslipDO::getDeptId);
        wrapper.eq(PayslipDO::getSalaryDate, pageReqVO.getDate());
        wrapper.eqIfPresent(PayslipDO::getCompanyDeptId, pageReqVO.getDeptId());

        return selectJoinPage(pageReqVO, PayslipDO.class, wrapper);
    }

    default PageResult<PayslipDO> selectMyPage(PayslipPageReqVO pageReqVO, Long loginUserId) {

        MPJLambdaWrapperX<PayslipDO> wrapper = new MPJLambdaWrapperX<PayslipDO>()
                .selectAll(PayslipDO.class)
                .selectAs(AdminUserDO::getNickname, PayslipDO::getUserName)
                .selectAs(DeptDO::getName, PayslipDO::getDeptName);
        wrapper.innerJoin(AdminUserDO.class, AdminUserDO::getId, PayslipDO::getUserId);
        wrapper.innerJoin(DeptDO.class, DeptDO::getId, PayslipDO::getDeptId);
        wrapper.eqIfPresent(PayslipDO::getSalaryDate, pageReqVO.getDate());
        wrapper.eq(PayslipDO::getUserId, loginUserId);
        wrapper.isNotNull(PayslipDO::getIsConfirm);

        return selectJoinPage(pageReqVO, PayslipDO.class, wrapper);
    }

    void deletePayslip(@Param("date") String date, @Param("deptId") Long deptId);
}
