package beilv.vipCard.service.impl;

import beilv.common.core.domain.AjaxResult;
import beilv.common.core.text.Convert;
import beilv.common.utils.DateUtils;
import beilv.common.utils.StringUtils;
import beilv.common.utils.uuid.IdUtils;
import beilv.utils.UuidUtils;
import beilv.vipCard.domain.Exchange;
import beilv.vipCard.domain.VipCard;
import beilv.vipCard.mapper.VipCardMapper;
import beilv.vipCard.service.IVipCardService;
import beilv.vipCardAmountLog.domain.VipCardAmountLog;
import beilv.vipCardAmountLog.mapper.VipCardAmountLogMapper;
import beilv.vipCardLog.domain.VipCardLog;
import beilv.vipCardLog.mapper.VipCardLogMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

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

/**
 * 储值会员卡Service业务层处理
 *
 * @author LG
 * @date 2025-11-12
 */
@Service
public class VipCardServiceImpl implements IVipCardService {
    @Resource
    private VipCardMapper vipCardMapper;

    @Resource
    private VipCardLogMapper cardLogMapper;

    @Resource
    private VipCardAmountLogMapper amountLogMapper;
    /**
     * 查询储值会员卡
     *
     * @param id 储值会员卡主键
     * @return 储值会员卡
     */
    @Override
    public VipCard selectVipCardById(String id) {
        return vipCardMapper.selectVipCardById(id);
    }

    /**
     * 查询储值会员卡列表
     *
     * @param vipCard 储值会员卡
     * @return 储值会员卡
     */
    @Override
    public List<VipCard> selectVipCardList(VipCard vipCard) {
        return vipCardMapper.selectVipCardList(vipCard);
    }

    /**
     * 新增储值会员卡
     *
     * @param vipCard 储值会员卡
     * @return 结果
     */
    @Override
    public String insertVipCard(VipCard vipCard) {
        String vipCardId = UuidUtils.getVipCardId();
        vipCard.setId(vipCardId);
        vipCard.setCreateTime(DateUtils.getNowDate());
        vipCard.setCardState("vip_card_state_open");
        vipCard.setVipLevel("vip_level_1");
        return vipCardMapper.insertVipCard(vipCard) > 0 ? vipCardId : null;
    }

    /**
     * 修改储值会员卡
     *
     * @param vipCard 储值会员卡
     * @return 结果
     */
    @Override
    public int updateVipCard(VipCard vipCard) {
        return vipCardMapper.updateVipCard(vipCard);
    }

    /**
     * 批量删除储值会员卡
     *
     * @param ids 需要删除的储值会员卡主键
     * @return 结果
     */
    @Override
    public int deleteVipCardByIds(String ids) {
        return vipCardMapper.deleteVipCardByIds(Convert.toStrArray(ids));
    }

    /**
     * 删除储值会员卡信息
     *
     * @param id 储值会员卡主键
     * @return 结果
     */
    @Override
    public int deleteVipCardById(String id) {
        return vipCardMapper.deleteVipCardById(id);
    }

    @Override
    public int refundById(VipCard vipCard) {
        vipCard.setBalance(BigDecimal.valueOf(0));
        vipCard.setRefundTime(DateUtils.getNowDate());
        vipCard.setCardState("vip_card_state_close");
        return vipCardMapper.updateVipCard(vipCard);
    }

    @Override
    public boolean haveVipCard(String userId) {
        return null != vipCardMapper.selectVipCardByUserId(userId);
    }

    @Override
    public VipCard selectVipCardByUserId(String userId) {
        return vipCardMapper.selectVipCardByUserId(userId);
    }

    @Override
    public AjaxResult exchange(Exchange exchange) {
        if(StringUtils.isEmpty(exchange.getCardId())){
            return AjaxResult.error("会员信息为空!");
        }
        if(StringUtils.isEmpty(exchange.getProductId())){
            return AjaxResult.error("未选中商品信息!");
        }
        //生成订单
        String orderId = IdUtils.fastSimpleUUID();
        VipCardLog vipCardLog = new VipCardLog();
        vipCardLog.setId(orderId);
        vipCardLog.setUserId(exchange.getUserId());
        vipCardLog.setPaymentType("score");
        vipCardLog.setOrderType("duihuan");
        vipCardLog.setBusId(exchange.getProductId());
        vipCardLog.setPaymentStatus("payment_status_have_paid");
        vipCardLog.setCreateTime(DateUtils.getNowDate());
        vipCardLog.setPaymentTime(vipCardLog.getCreateTime());
        vipCardLog.setPracticalMoney(exchange.getPayScore());
        vipCardLog.setPaymentId(exchange.getCardId());
        cardLogMapper.insertVipCardLog(vipCardLog);

        System.out.println("exchange.getPayScore().negate() = " + exchange.getPayScore().negate());

        //存在会员卡, 增加积分流水
        VipCardAmountLog vipCardAmountLog = new VipCardAmountLog(exchange.getUserId(), exchange.getCardId(), orderId, exchange.getScore(), exchange.getPayScore().negate(), "2");
        amountLogMapper.insertVipCardAmountLog(vipCardAmountLog);

        //存在会员卡, 增加积分
        VipCard vipCard = new VipCard();
        vipCard.setUserId(Long.valueOf(exchange.getUserId()));
        vipCard.setId(exchange.getCardId());
        vipCard.setScore(vipCardAmountLog.getRemainingAmount());
        vipCardMapper.updateVipCard(vipCard);

        return AjaxResult.success();
    }
}
