package com.yc.ship.module.otc.service.storecard;

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.yc.ship.framework.common.pojo.PageResult;
import com.yc.ship.framework.common.util.object.BeanUtils;
import com.yc.ship.framework.mybatis.core.query.MPJLambdaWrapperX;
import com.yc.ship.module.otc.controller.admin.storecard.vo.StoreCardPageReqVO;
import com.yc.ship.module.otc.controller.admin.storecard.vo.StoreCardSaveReqVO;
import com.yc.ship.module.otc.dal.dataobject.store.StoreDO;
import com.yc.ship.module.otc.dal.dataobject.storecard.StoreCardDO;
import com.yc.ship.module.otc.dal.mysql.storecard.StoreCardMapper;
import com.yc.ship.module.otc.enums.ErrorCodeConstants;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

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

import static com.yc.ship.framework.common.exception.util.ServiceExceptionUtil.exception;

/**
 * 门店资金卡 Service 实现类
 *
 * @author 管理员
 */
@Service
@Validated
public class StoreCardServiceImpl implements StoreCardService {

    @Resource
    private StoreCardMapper storeCardMapper;

    @Override
    public Long createStoreCard(StoreCardSaveReqVO createReqVO) {
        // 插入
        StoreCardDO storeCard = BeanUtils.toBean(createReqVO, StoreCardDO.class);
        storeCard.setId(createReqVO.getStoreId());
        storeCardMapper.insert(storeCard);
        // 返回
        return storeCard.getId();
    }

    @Override
    public void updateStoreCard(StoreCardSaveReqVO updateReqVO) {
        if (updateReqVO.getId() == null) {
            UpdateWrapper<StoreCardDO> updateWrapper = new UpdateWrapper<>();
            updateWrapper.eq("id", updateReqVO.getStoreId());
            updateWrapper.set("credit_type", updateReqVO.getCreditType());
            updateWrapper.set("balance_type", updateReqVO.getBalanceType());
//            updateWrapper.set("credit", updateReqVO.getCredit() == null ? BigDecimal.ZERO : updateReqVO.getCredit());
            storeCardMapper.update(null, updateWrapper);
        } else {
            // 校验存在
            validateStoreCardExists(updateReqVO.getId());
            // 更新
            StoreCardDO updateObj = BeanUtils.toBean(updateReqVO, StoreCardDO.class);
            storeCardMapper.updateById(updateObj);
        }
    }

    @Override
    public void deleteStoreCard(Long id) {
        // 校验存在
        validateStoreCardExists(id);
        // 删除
        storeCardMapper.deleteById(id);
    }

    private void validateStoreCardExists(Long id) {
        if (storeCardMapper.selectById(id) == null) {
            throw exception(ErrorCodeConstants.STORE_CARD_NOT_EXISTS);
        }
    }

    @Override
    public StoreCardDO getStoreCard(Long id) {
        return storeCardMapper.selectById(id);
    }

    @Override
    public StoreCardDO getStoreCardByStoreId(Long storeId) {
        return storeCardMapper.selectOne(StoreCardDO::getStoreId, storeId);
    }

    @Override
    public PageResult<StoreCardDO> getStoreCardPage(StoreCardPageReqVO pageReqVO) {
        return storeCardMapper.selectPage(pageReqVO);
    }

    @Override
    public List<StoreCardDO> selectListByAgency() {
        MPJLambdaWrapper<StoreCardDO> wrapper = new MPJLambdaWrapperX<StoreCardDO>()
                .selectAll(StoreCardDO.class)
                .innerJoin(StoreDO.class, StoreDO::getId, StoreCardDO::getStoreId)
                .ne(StoreCardDO::getCreditType, 0);
        return storeCardMapper.selectJoinList(StoreCardDO.class,wrapper);
    }
}
