package com.jeesharp.business.modules.coupon.mapper;

import com.jeesharp.business.modules.coupon.entity.MemberCoupon;
import com.jeesharp.business.modules.coupon.vo.MemberCouponChannelCountVO;
import com.jeesharp.business.modules.coupon.vo.MemberCouponDailyCountVO;
import com.jeesharp.business.modules.coupon.vo.MemberCouponQueryVO;
import com.jeesharp.framework.mybatis.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 会员优惠券 Mapper。
 *
 * @author jeesharp
 * @since 2026-05-07
 */
@Mapper
public interface MemberCouponMapper extends BaseMapper<MemberCoupon, MemberCouponQueryVO> {

    /**
     * 将会员名下「未使用且已过有效期」的券批量置为已过期。
     * <p>独立 SQL，避免与 XML 中手写 {@code update(et, ew)} 的 {@code id="update"} 语句参数模型冲突。</p>
     *
     * @param memberId      会员主键
     * @param now           当前时间（与 valid_end_date 比较）
     * @param unusedStatus  未使用状态值
     * @param expiredStatus 已过期状态值
     * @return 影响行数
     */
    int markExpiredIfPastEnd(
            @Param("memberId") String memberId,
            @Param("now") LocalDateTime now,
            @Param("unusedStatus") Integer unusedStatus,
            @Param("expiredStatus") Integer expiredStatus);

    Long countStoreOfflineReceive(
            @Param("tenantId") String tenantId,
            @Param("sceneCode") String sceneCode,
            @Param("startDateTime") LocalDateTime startDateTime,
            @Param("endDateTime") LocalDateTime endDateTime,
            @Param("channelCode") String channelCode);

    List<MemberCouponDailyCountVO> dailyStoreOfflineReceive(
            @Param("tenantId") String tenantId,
            @Param("sceneCode") String sceneCode,
            @Param("startDateTime") LocalDateTime startDateTime,
            @Param("endDateTime") LocalDateTime endDateTime,
            @Param("channelCode") String channelCode);

    List<MemberCouponChannelCountVO> channelStoreOfflineReceive(
            @Param("tenantId") String tenantId,
            @Param("sceneCode") String sceneCode,
            @Param("startDateTime") LocalDateTime startDateTime,
            @Param("endDateTime") LocalDateTime endDateTime);
}
