package com.czg.market.service;

import com.czg.account.dto.QueryReceiveDto;
import com.czg.account.vo.CouponReceiveVo;
import com.czg.account.vo.UserCouponVo;
import com.czg.market.dto.*;
import com.czg.market.entity.MkShopCouponRecord;
import com.czg.market.entity.ShopCoupon;
import com.czg.market.vo.UserCouponVO;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;

import java.util.List;
import java.util.Map;

/**
 * 优惠券发放记录表 服务层。
 *
 * @author ww
 * @since 2025-09-13
 */
public interface MkShopCouponRecordService extends IService<MkShopCouponRecord> {


    List<CouponReceiveVo> queryReceive(QueryReceiveDto param);

    List<UserCouponVO> findByUser(String name, List<Long> shopUserIds, Integer status,Long shopId);

    List<UserCouponVo> queryByVipIdAndShopId(Long shopId, Long shopUserId, Integer type, Integer isFood);

    /**
     * 优惠券列表/已领取详情
     */
    Map<String, Object> getRecord(MkShopCouponRecordDTO param, String startTime, String endTime);
    /**
     * 消费赠券已领取详情
     */
    Page<MkShopCouponRecordDTO> getConsumerRecord(MkShopCouponRecordDTO param, String startTime, String endTime);
    Page<MkShopCouponRecordDTO> getRecordByShopUser(MkShopCouponRecordDTO param, String startTime, String endTime);

    /**
     * 发放券 统一方法
     *
     * @param giftDTO 除 sourceFlowId 外 全必填 如果有 也填
     * @param number  发放数量
     * @param isLimit 是否校验限领/扣除剩余数量，活动与管理员添加 不计限领
     */
    void receiveCoupon(MkShopCouponGiftDTO giftDTO, Integer number, boolean isLimit);


    /**
     * 短信 事件发送优惠券
     * 通过事件发放优惠券
     */
    void smsGrantCoupon(SmsPushEventDTO param);
    /**
     * 公众号 事件发送优惠券
     * 通过事件发放优惠券
     */
    void acGrantCoupon(AcPushEventDTO param);

    /**
     * 用户优惠券 失效/删除
     */
    void deleteRecord(Long id);

    Boolean grant(Long shopId, MkRewardCouponDTO rewardCouponDTO, String source);

    /**
     * 组装 群聊活动优惠券
     */
    MkShopCouponRecord assembleRecord(Long chatCouponId, ShopCoupon coupon);

    /**
     * 群聊活动优惠券发放
     */
    void grantChatCoupon(MkShopCouponRecord record, Integer number);

}
