package cn.iocoder.yudao.module.bpm.convert.oa;

import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.cash.BpmOACashCreateReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.cash.BpmOACashRespVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.cash.Cash;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOACashDO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOACashItemDO;
import cn.iocoder.yudao.module.system.api.bank.dto.BankRespDTO;
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

import java.util.List;
import java.util.Map;

/**
 * 现金支出 Convert
 *
 * @author 符溶馨
 */
@Mapper
public interface BpmOACashConvert {

    BpmOACashConvert INSTANCE = Mappers.getMapper(BpmOACashConvert.class);

    BpmOACashDO convert(BpmOACashCreateReqVO bean);

    BpmOACashRespVO convert(BpmOACashDO bean);

    default BpmOACashRespVO convert1(BpmOACashDO cashDO, List<BpmOACashItemDO> cashItemDOs,
                                     Map<Long, DeptRespDTO> deptMap, BankRespDTO bankRespDTO) {

        BpmOACashRespVO respVO = BeanUtils.toBean(cashDO, BpmOACashRespVO.class);

        List<Cash> cashItems = BeanUtils.toBean(cashItemDOs, Cash.class);
        if (deptMap != null) {

            cashItems = convertList(cashItems, deptMap);
        }

        if (bankRespDTO != null) {
            respVO.setBankNo(bankRespDTO.getBankNo());
            respVO.setBankName(bankRespDTO.getBankName());
            respVO.setPayeeName(bankRespDTO.getNickname());
        }

        respVO.setCashItem(cashItems);
        return respVO;
    }

    default List<Cash> convertList(List<Cash> list, Map<Long, DeptRespDTO> deptMap) {

        return CollectionUtils.convertList(list, cash -> convert(cash, deptMap.get(cash.getDeptId())));
    }

    default Cash convert(Cash cashItem, DeptRespDTO dept) {

        if (dept != null) {
            cashItem.setDeptName(dept.getName());
        }

        return cashItem;
    }
}
