package com.yc.ship.module.otc.convert.store;

import com.yc.ship.framework.common.util.collection.CollectionUtils;
import com.yc.ship.framework.common.util.collection.MapUtils;
import com.yc.ship.framework.common.util.object.BeanUtils;
import com.yc.ship.module.otc.api.store.dto.StoreCardRespDTO;
import com.yc.ship.module.otc.api.store.dto.StoreMachineDTO;
import com.yc.ship.module.otc.controller.admin.store.vo.StoreBalanceRespVO;
import com.yc.ship.module.otc.controller.admin.storeaudit.vo.StoreAuditRespVO;
import com.yc.ship.module.otc.controller.admin.storecard.vo.StoreCardRespVO;
import com.yc.ship.module.otc.controller.admin.storecreditlog.vo.StoreCreditLogRespVO;
import com.yc.ship.module.otc.controller.admin.storetradelog.vo.StoreTradeLogRespVO;
import com.yc.ship.module.otc.dal.dataobject.store.StoreDO;
import com.yc.ship.module.otc.dal.dataobject.store.StoreMachineDO;
import com.yc.ship.module.otc.dal.dataobject.storeaudit.StoreAuditDO;
import com.yc.ship.module.otc.dal.dataobject.storecard.StoreCardDO;
import com.yc.ship.module.otc.dal.dataobject.storecreditlog.StoreCreditLogDO;
import com.yc.ship.module.otc.dal.dataobject.storetradelog.StoreTradeLogDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

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

@Mapper
public interface StoreConvert {

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

    default List<StoreCardRespVO> convertStoreCardList(List<StoreCardDO> list, Map<Long, StoreDO> storeMap) {
        return CollectionUtils.convertList(list, storeCard -> {
            StoreCardRespVO cardVO = BeanUtils.toBean(storeCard, StoreCardRespVO.class);
            MapUtils.findAndThen(storeMap, storeCard.getStoreId(), store -> cardVO.setStoreName(store.getStoreName()));
            return cardVO;
        });
    }

    default List<StoreAuditRespVO> convertStoreAuditList(List<StoreAuditDO> list, Map<Long, StoreDO> storeMap) {
        return CollectionUtils.convertList(list, storeAudit -> {
            StoreAuditRespVO auditVO = BeanUtils.toBean(storeAudit, StoreAuditRespVO.class);
            MapUtils.findAndThen(storeMap, storeAudit.getStoreId(), store -> auditVO.setStoreName(store.getStoreName()));
            return auditVO;
        });
    }

    default List<StoreCreditLogRespVO> convertStoreCreditLogList(List<StoreCreditLogDO> list, Map<Long, StoreDO> storeMap) {
        return CollectionUtils.convertList(list, storeCreditLog -> {
            StoreCreditLogRespVO creditLogVO = BeanUtils.toBean(storeCreditLog, StoreCreditLogRespVO.class);
            MapUtils.findAndThen(storeMap, storeCreditLog.getStoreId(), store -> creditLogVO.setStoreName(store.getStoreName()));
            return creditLogVO;
        });
    }

    default List<StoreTradeLogRespVO> convertStoreTradeLogList(List<StoreTradeLogDO> list, Map<Long, StoreDO> storeMap) {
        return CollectionUtils.convertList(list, storeTradeLog -> {
            StoreTradeLogRespVO tradeLogVO = BeanUtils.toBean(storeTradeLog, StoreTradeLogRespVO.class);
            MapUtils.findAndThen(storeMap, storeTradeLog.getStoreId(), store -> tradeLogVO.setStoreName(store.getStoreName()));
            return tradeLogVO;
        });
    }

    StoreMachineDTO convert(StoreMachineDO storeMachineDO);
    StoreBalanceRespVO convertStoreType(StoreCardRespDTO storeCardRespDTO);
}
