package com.engine.salary.service.impl;

import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
import com.engine.salary.entity.salaryformula.ExpressFormula;
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
import com.engine.salary.entity.salarysob.bo.SalarySobBackItemBO;
import com.engine.salary.entity.salarysob.dto.SalarySobBackItemDTO;
import com.engine.salary.entity.salarysob.param.SalarySobBackItemSaveParam;
import com.engine.salary.entity.salarysob.po.SalarySobBackItemPO;
import com.engine.salary.entity.salarysob.po.SalarySobPO;
import com.engine.salary.enums.SalaryValueTypeEnum;
import com.engine.salary.exception.SalaryRunTimeException;
import com.engine.salary.mapper.salarysob.SalarySobBackItemMapper;
import com.engine.salary.service.SalaryFormulaService;
import com.engine.salary.service.SalaryItemService;
import com.engine.salary.service.SalarySobBackItemService;
import com.engine.salary.service.SalarySobService;
import com.engine.salary.util.SalaryDateUtil;
import com.engine.salary.util.SalaryI18nUtil;
import com.engine.salary.util.db.MapperProxyFactory;
import com.google.common.collect.Lists;
import org.apache.commons.lang3.math.NumberUtils;
import weaver.hrm.User;

import java.time.LocalDateTime;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

/**
 * @author Harryxzy
 * @date 2022/11/15 16:19
 * @description 薪资账套的回算项目
 */
public class SalarySobBackItemServiceImpl extends Service implements SalarySobBackItemService {

    private SalarySobBackItemMapper getSalarySobBackItemMapper() {
        return MapperProxyFactory.getProxy(SalarySobBackItemMapper.class);
    }

    private SalarySobService getSalarySobService(User user) {
        return ServiceUtil.getService(SalarySobServiceImpl.class, user);
    }

    private SalaryItemService getSalaryItemService(User user) {
        return ServiceUtil.getService(SalaryItemServiceImpl.class, user);
    }

    private SalaryFormulaService getSalaryFormulaService(User user) {
        return ServiceUtil.getService(SalaryFormulaServiceImpl.class, user);
    }

    @Override
    public List<SalarySobBackItemPO> listBySalarySobId(Long salarySobId) {
        return getSalarySobBackItemMapper().listSome(SalarySobBackItemPO.builder().salarySobId(salarySobId).build());
    }

    @Override
    public List<SalarySobBackItemPO> listAll() {
        return getSalarySobBackItemMapper().listAll();
    }

    @Override
    public void batchInsert(List<SalarySobBackItemPO> needInsertSalarySobBackItems) {
        List<List<SalarySobBackItemPO>> partition = Lists.partition(needInsertSalarySobBackItems, 100);
        partition.forEach(getSalarySobBackItemMapper()::batchInsert);
    }

    @Override
    public SalarySobBackItemPO getById(Long salarySobBackItemId) {
        return getSalarySobBackItemMapper().getById(salarySobBackItemId);
    }

    @Override
    public List<SalarySobBackItemDTO> save(SalarySobBackItemSaveParam saveParam) {
        // 查询薪资账套是否存在
        SalarySobPO salarySobPO = getSalarySobService(user).getById(saveParam.getSalarySobId());
        if (Objects.isNull(salarySobPO)) {
            throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98769, "薪资账套不存在或已被删除"));
        }
        // 查询薪资账套下的回算薪资项目
        SalarySobBackItemPO salarySobBackItem = getById(saveParam.getId());
        if (Objects.isNull(salarySobBackItem)) {
            throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "回算薪资项目不存在或已被删除"));
        }
        // 查询薪资项目
        SalaryItemPO salaryItem = getSalaryItemService(user).getById(saveParam.getSalaryItemId());
        if (salaryItem == null) {
            throw new SalaryRunTimeException("参数错误，项目不存在或已被删除");
        }
        salarySobBackItem.setRoundingMode(saveParam.getRoundingMode().getValue());
        salarySobBackItem.setPattern(saveParam.getPattern());
        salarySobBackItem.setValueType(saveParam.getValueType().getValue());
        salarySobBackItem.setFormulaId(saveParam.getValueType() == SalaryValueTypeEnum.INPUT ? NumberUtils.LONG_ZERO : saveParam.getFormulaId());
        salarySobBackItem.setUpdateTime(SalaryDateUtil.localDateTimeToDate(LocalDateTime.now()));
        getSalarySobBackItemMapper().updateIgnoreNull(salarySobBackItem);

        // 查询公式
        List<ExpressFormula> expressFormulas = getSalaryFormulaService(user).listExpressFormula(Collections.singleton(salarySobBackItem.getFormulaId()));
        return SalarySobBackItemBO.convert2DTO(Collections.singletonList(salarySobBackItem), Collections.singletonList(salaryItem), expressFormulas);
    }

    @Override
    public Long getCountBySalarySobIdIn(Collection<Long> salarySobIds) {
        return getSalarySobBackItemMapper().countBySalarySobIdIn(salarySobIds);
    }

    @Override
    public int deleteBySalarySobIds(Collection<Long> salarySobIds) {
        return getSalarySobBackItemMapper().deleteBySalarySobIds(salarySobIds);
    }

    @Override
    public List<SalarySobBackItemPO> listBySalaryItemIds(Collection<Long> salaryItemIds) {
        return getSalarySobBackItemMapper().listSome(SalarySobBackItemPO.builder().salaryItemIds(salaryItemIds).build());
    }

}
