package com.czg.market.service;

import com.czg.account.vo.PointsShopListVO;
import com.czg.market.dto.MkPointsUserDTO;
import com.czg.market.entity.MkPointsUser;
import com.czg.market.enums.PointsConstant;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;

import java.util.List;

/**
 * 用户积分 服务层。
 *
 * @author ww
 * @since 2025-12-08
 */
public interface MkPointsUserService extends IService<MkPointsUser> {


    Page<MkPointsUserDTO> getPointsUserPage(String phone, Integer page, Integer size);


    List<PointsShopListVO> pointsShopList(Long userId, String shopName);

    /**
     * 获取用户积分信息
     * 返回的数据ID可能为空 不影响修改用户积分 统一接口的处理
     *
     * @param shopId     店铺Id
     * @param shopUserId 店铺用户Id
     * @param userId     会员Id
     */
    MkPointsUser getPointsUser(Long shopId, Long shopUserId, Long userId);

    /**
     * 修改用户积分 统一接口  userId和shopUserId不能同时为空
     *
     * @param shopId    店铺Id 注意不要直接使用shopUser的ID
     * @param floatType {@link com.czg.market.enums.PointsConstant}
     * @param points    积分数 正数
     * @param reason    事件
     *                  会员消费送积分
     *                  消费￥多少 送多少积分
     *                  积分抵扣账单
     */
    Long alterPoints(Long userId, Long shopUserId, @NotNull Long shopId, @NotNull PointsConstant floatType,
                     @NotNull Integer points, Long sourceId, @NotBlank String reason);

    /**
     * 订单退款 赠送的积分 扣除
     */
    void removePointByOrder(Long shopId, Long userId, Long orderId, String orderNo, String reason);
}
