package cn.iocoder.yudao.module.system.service.hr.type;

import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.hr.vo.type.SalaryTypeCreateReqVO;
import cn.iocoder.yudao.module.system.controller.admin.hr.vo.type.SalaryTypeUpdateSortVO;
import cn.iocoder.yudao.module.system.dal.dataobject.hr.SalaryTypeDO;
import cn.iocoder.yudao.module.system.dal.mysql.hr.SalaryTypeMapper;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.SALARY_TYPE_NAME_EXISTS;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.SALARY_TYPE_NOT_EXISTS;

@Service
public class SalaryTypeServiceImpl implements SalaryTypeService{

    @Resource
    private SalaryTypeMapper salaryTypeMapper;

    @Resource
    private SalaryTypeItemService salaryTypeItemService;

    @Override
    public Long createSalaryType(SalaryTypeCreateReqVO createReqVO) {

        // 校验类型名称唯一性
        validateTypeNameExists(null, createReqVO.getName());

        SalaryTypeDO salaryTypeDO = BeanUtils.toBean(createReqVO, SalaryTypeDO.class)
                .setStatus(CommonStatusEnum.ENABLE.getStatus());

        salaryTypeMapper.insert(salaryTypeDO);
        return salaryTypeDO.getId();
    }

    @Override
    public void updateSalaryType(SalaryTypeCreateReqVO updateReqVO) {

        validateTypeExists(updateReqVO.getId());
        validateTypeNameExists(updateReqVO.getId(), updateReqVO.getName());

        SalaryTypeDO salaryTypeDO = BeanUtils.toBean(updateReqVO, SalaryTypeDO.class);
        salaryTypeMapper.updateById(salaryTypeDO);
    }

    @Override
    public void updateSalaryTypeStatus(Long id, Integer status) {

        validateTypeExists(id);

        SalaryTypeDO salaryTypeDO = new SalaryTypeDO()
                .setId(id)
                .setStatus(status);

        salaryTypeMapper.updateById(salaryTypeDO);

        // 同步更新 类型配置状态
        salaryTypeItemService.updateStatusByTypeId(id, status);
    }

    private void validateTypeExists(Long id) {
        if (salaryTypeMapper.selectById(id) == null) {
            throw exception(SALARY_TYPE_NOT_EXISTS);
        }
    }

    private void validateTypeNameExists(Long id, String name) {

        if (StrUtil.isBlank(name)) {
            return;
        }

        // 校验类型名称唯一性
        SalaryTypeDO salaryTypeDO = salaryTypeMapper.selectOne(SalaryTypeDO::getName, name);
        if (salaryTypeDO == null) {
            return;
        }
        if (id == null) {
            throw exception(SALARY_TYPE_NAME_EXISTS);
        }
        if (!salaryTypeDO.getId().equals(id)) {
            throw exception(SALARY_TYPE_NAME_EXISTS);
        }
    }

    @Override
    public SalaryTypeDO getSalaryType(Long id) {

        return salaryTypeMapper.selectById(id);
    }

    @Override
    public List<SalaryTypeDO> getSalaryTypeList() {

        return salaryTypeMapper.selectList(new LambdaQueryWrapperX<SalaryTypeDO>()
                .orderByAsc(SalaryTypeDO::getSort));
    }

    @Override
    public void updateSort(List<SalaryTypeUpdateSortVO> updateSortVO) {

        salaryTypeMapper.updateBatch(BeanUtils.toBean(updateSortVO, SalaryTypeDO.class));
    }
}
