package org.xyzh.api.usercenter.points;

import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.dto.usercenter.TbUserPoints;
import org.xyzh.common.dto.usercenter.TbPointsRecord;

import java.util.List;

/**
 * @description 用户积分服务接口
 * @filename UserPointsService.java
 * @author yslg
 * @copyright xyzh
 * @since 2025-10-15
 */
public interface UserPointsService {

    /**
     * @description 获取用户积分信息
     * @param userID 用户ID
     * @return ResultDomain<TbUserPoints> 用户积分信息
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbUserPoints> getUserPoints(String userID);

    /**
     * @description 更新用户积分
     * @param userPoints 用户积分信息
     * @return ResultDomain<TbUserPoints> 更新结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbUserPoints> updateUserPoints(TbUserPoints userPoints);

    /**
     * @description 增加用户积分
     * @param userID 用户ID
     * @param points 积分数量
     * @param sourceType 来源类型
     * @param sourceID 来源ID
     * @param description 说明
     * @return ResultDomain<TbUserPoints> 更新结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbUserPoints> addUserPoints(String userID, Integer points, Integer sourceType, String sourceID, String description);

    /**
     * @description 消费用户积分
     * @param userID 用户ID
     * @param points 积分数量
     * @param sourceType 来源类型
     * @param sourceID 来源ID
     * @param description 说明
     * @return ResultDomain<TbUserPoints> 更新结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbUserPoints> consumeUserPoints(String userID, Integer points, Integer sourceType, String sourceID, String description);

    /**
     * @description 获取用户积分记录
     * @param userID 用户ID
     * @param type 类型（1获得 2消费）
     * @param sourceType 来源类型
     * @return ResultDomain<TbPointsRecord> 积分记录列表
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbPointsRecord> getPointsRecords(String userID, Integer type, Integer sourceType);

    /**
     * @description 添加积分记录
     * @param pointsRecord 积分记录
     * @return ResultDomain<TbPointsRecord> 添加结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbPointsRecord> addPointsRecord(TbPointsRecord pointsRecord);
}