package com.starry.admin.modules.custom.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity;
import com.starry.admin.modules.custom.module.vo.PlayCustomRankingQueryVo;
import com.starry.admin.modules.custom.module.vo.PlayCustomRankingReturnVo;
import com.starry.admin.modules.custom.module.vo.PlayCustomUserQueryVo;
import com.starry.admin.modules.custom.module.vo.PlayCustomUserReturnVo;
import com.starry.admin.modules.order.module.entity.PlayOrderInfoEntity;
import java.math.BigDecimal;
import java.util.List;

/**
 * 顾客Service接口
 *
 * @author admin
 * @since 2024-04-08
 */
public interface IPlayCustomUserInfoService extends IService<PlayCustomUserInfoEntity> {

    /**
     * 查询顾客
     *
     * @param openId
     *            顾客主键
     * @return 顾客
     */
    PlayCustomUserInfoEntity selectByOpenid(String openId);

    /**
     * 根据顾客等级，查询顾客充值余额时,实际支付金额
     *
     * @param rechargeAmount
     *            重置金额，单位分
     * @param customId
     *            顾客ID
     * @return 实际支付金额
     */
    BigDecimal getCustomPaymentAmount(BigDecimal rechargeAmount, String customId);

    /**
     * 顾客账户余额充值
     *
     * @param rechargeAmount
     *            充值金额，单位分
     * @param customId
     *            顾客ID
     * @param orderId
     *            订单ID
     */
    void customAccountBalanceRecharge(BigDecimal rechargeAmount, String customId, String orderId);

    /**
     * 查询顾客
     *
     * @param id
     *            顾客主键
     * @return 顾客
     */
    PlayCustomUserInfoEntity selectById(String id);

    /**
     * 分页查询顾客列表
     *
     * @param vo
     *            顾客查询对象
     * @return 顾客集合
     */
    IPage<PlayCustomUserReturnVo> selectByPage(PlayCustomUserQueryVo vo);

    /**
     * 分页查询顾客排名列表
     *
     * @param vo
     *            顾客查询对象
     * @return 顾客集合
     */
    IPage<PlayCustomRankingReturnVo> selectRankingByPage(PlayCustomRankingQueryVo vo);

    /**
     * 新增顾客
     *
     * @param playCustomUserInfo
     *            顾客
     * @return 结果
     */
    boolean create(PlayCustomUserInfoEntity playCustomUserInfo);

    /**
     * 更新token
     *
     * @param id
     *            账户余额
     * @param token
     *            TOKEN
     * @author admin
     * @since 2024/4/9 14:33
     **/
    void updateTokenById(String id, String token);

    /**
     * 更新账号余额
     *
     * @param id
     *            用户ID
     * @param accountBalance
     *            账户余额
     * @author admin
     * @since 2024/4/9 14:33
     **/
    void updateAccountBalanceById(String id, BigDecimal accountBalance);

    /**
     * 更新顾客账户余额信息
     *
     * @param userId
     *            用户ID
     * @param balanceBeforeOperation
     *            操作前余额
     * @param balanceAfterOperation
     *            操作后余额
     * @param operationType
     *            操作类型（0:充值;1:消费;2:服务;3:退款）
     * @param operationAction
     *            操作动作
     * @param balanceMoney
     *            操作金额
     * @param giftAmount
     *            赠送金额
     * @param orderId
     *            订单ID
     */
    void updateAccountBalanceById(String userId, BigDecimal balanceBeforeOperation, BigDecimal balanceAfterOperation,
            String operationType, String operationAction, BigDecimal balanceMoney, BigDecimal giftAmount,
            String orderId);

    /**
     * 修改顾客
     *
     * @param playCustomUserInfo
     *            顾客
     * @return 结果
     */
    boolean update(PlayCustomUserInfoEntity playCustomUserInfo);

    /**
     * 批量删除顾客
     *
     * @param ids
     *            需要删除的顾客主键集合
     * @return 结果
     */
    int deletePlayCustomUserInfoByIds(String[] ids);

    /**
     * 删除顾客信息
     *
     * @param id
     *            顾客主键
     * @return 结果
     */
    int deletePlayCustomUserInfoById(String id);

    List<PlayCustomUserInfoEntity> simpleList();

    /**
     * 保存订单信息
     *
     * @param entity
     *            订单实体 * @since 2024/7/18 17:13
     * @author admin
     **/
    void saveOrderInfo(PlayOrderInfoEntity entity);

    /**
     * 处理订单完成后的顾客统计更新。
     *
     * @param entity 完成的订单实体
     */
    void handleOrderCompletion(PlayOrderInfoEntity entity);
}
