package com.ruoyi.ss.vip.service;

import java.math.BigDecimal;
import java.util.List;

import com.ruoyi.ss.vip.domain.Vip;
import com.ruoyi.ss.vip.domain.VipQuery;
import com.ruoyi.ss.vip.domain.VipVO;

/**
 * 会员Service接口
 *
 * @author ruoyi
 * @date 2024-12-09
 */
public interface VipService
{
    /**
     * 查询会员
     *
     * @param id 会员主键
     * @return 会员
     */
    public VipVO selectVipById(Long id);

    /**
     * 查询会员列表
     *
     * @param vip 会员
     * @return 会员集合
     */
    public List<VipVO> selectVipList(VipQuery vip);

    /**
     * 新增会员
     *
     * @param vip 会员
     * @return 结果
     */
    public int insertVip(Vip vip);

    /**
     * 修改会员
     *
     * @param vip 会员
     * @return 结果
     */
    public int updateVip(Vip vip);

    /**
     * 批量删除会员
     *
     * @param ids 需要删除的会员主键集合
     * @return 结果
     */
    public int deleteVipByIds(Long[] ids);

    /**
     * 删除会员信息
     *
     * @param id 会员主键
     * @return 结果
     */
    public int deleteVipById(Long id);

    /**
     * 查询数量
     * @param query
     * @return
     */
    int selectCount(VipQuery query);

    /**
     * 查询用户相同权益的会员
     *
     * @param userId     用户
     * @param levelId    等级ID
     * @param discount   折扣
     * @param storeId    可用店铺
     * @param limitType  限制类型
     * @param limitCount 限制次数
     */
    VipVO selectUserSameVip(Long userId, Long levelId, BigDecimal discount, Long storeId, String limitType, Integer limitCount);

    /**
     * 续费 VIP
     * @param id          VIP ID
     * @param days        续费天数
     * @param count       可用次数（叠加）
     */
    int renewal(Long id, Integer days, Integer count);

    /**
     * 逻辑删除
     * @param ids
     * @return
     */
    int logicDel(List<Long> ids);

    /**
     * 获取会员列表
     * @param ids
     */
    List<VipVO> selectVipByIds(List<Long> ids);

    /**
     * 查询可用会员列表
     * @param query
     * @return
     */
    List<VipVO> selectAvailableList(VipQuery query);

    /**
     * 查询本人在店铺可用的会员列表
     * @param userId
     * @param storeId
     * @return
     */
    List<VipVO> selectUserAvaliableStoreVip(Long userId, Long storeId);

}
