package shop.alien.store.service;

import com.baomidou.mybatisplus.extension.service.IService;
import shop.alien.entity.store.LifeDiscountCouponFriendRule;
import shop.alien.entity.store.LifeDiscountCouponStoreFriend;
import shop.alien.entity.store.UserLoginInfo;
import shop.alien.entity.store.dto.LifeDiscountCouponStoreFriendDto;
import shop.alien.entity.store.vo.LifeDiscountCouponFriendRuleDetailVo;
import shop.alien.entity.store.vo.LifeDiscountCouponFriendRuleVo;
import shop.alien.entity.store.vo.LifeDiscountCouponStoreFriendVo;

import java.util.List;

/**
 * <p>
 * 优惠券商户发放好友优惠券关系表	 服务类
 * </p>
 *
 * @author ssk
 * @since 2025-02-19
 */
public interface LifeDiscountCouponStoreFriendService extends IService<LifeDiscountCouponStoreFriend> {

    /**
     * 获取该店铺的好友及其可用优惠券列表
     */
    List<LifeDiscountCouponStoreFriendVo> getFriendCouponList(UserLoginInfo userLoginInfo, String friendUserId);

    /**
     * 向好友店铺赠送优惠券（POST /setFriendCoupon）。
     * <ul>
     *   <li>扣减或校验 {@code life_discount_coupon} 库存；</li>
     *   <li>插入或合并 {@code life_discount_coupon_store_friend}（同券、同赠送方、同接收店铺合并 single_qty）；</li>
     *   <li>快照：{@code expiration_date}、{@code long_term_valid}、活动起止等<strong>仅</strong>根据请求中的 couponId 查询 {@code life_discount_coupon} 写入，不使用请求体中的效期字段。</li>
     * </ul>
     */
    boolean setFriendCoupon(UserLoginInfo userLoginInfo, LifeDiscountCouponStoreFriendDto lifeDiscountCouponStoreFriendDto);

    /**
     * 消费后发放好友优惠券并返回列表
     */
    List<LifeDiscountCouponStoreFriendVo> issueFriendCoupon(LifeDiscountCouponStoreFriendDto lifeDiscountCouponStoreFriendDto);


    /**
     * (新)消费后发放好友优惠券并返回列表
     */
    List<LifeDiscountCouponStoreFriendVo> newIssueFriendCoupon(LifeDiscountCouponStoreFriendDto lifeDiscountCouponStoreFriendDto);

    /**
     * 获取该订单发放的好友列表
     */
    List<LifeDiscountCouponStoreFriendVo> getSendCoupons(LifeDiscountCouponStoreFriendDto lifeDiscountCouponStoreFriendDto);

    /**
     * 修改好友优惠劵发布状态
     *
     * @param giveCouponId
     * @param releaseType
     */
    int releaseAndCancelFriendStoreCoupon(String giveCouponId, String releaseType);

    LifeDiscountCouponFriendRuleVo saveFriendCouponRule(LifeDiscountCouponFriendRule lifeDiscountCouponFriendRule);

    void delFriendCouponRule(String id);

    /**
     * 获取收到的好友优惠券列表（仅 life_discount_coupon）。type=4 为历史参数，将返回空列表。
     *
     * @param couponType 优惠券类型：1=满减券，2=折扣券，null=全部
     */
    List<LifeDiscountCouponFriendRuleDetailVo> getReceivedFriendCouponList(String storeId, String friendStoreUserId, Integer type, Integer couponType);

    List<LifeDiscountCouponFriendRuleVo> getRuleList(String storeId, String acName, String status);

    LifeDiscountCouponFriendRuleVo getRuleById(String id);

    /**
     * 赠券历史列表（GET /getReceivedSendFriendCouponList）：商户间好友赠送记录。
     * <ul>
     *   <li>{@code queryType=1}：我收到的，列表展示<strong>对方赠送方</strong>店铺与头像；</li>
     *   <li>{@code queryType=2}：我送出的，展示<strong>对方接收方</strong>店铺与头像；</li>
     *   <li>仅 {@code life_discount_coupon}（{@code coupon_id}）；{@code type=4} 时返回空（兼容旧客户端）；</li>
     *   <li>模板逻辑删除时通过按 id 查询含删除行补全券信息。</li>
     * </ul>
     *
     * @param storeUserId 当前登录商户 {@code store_user.id}（必填）
     * @param queryType   1=我收到的，2=我送出的
     * @param storeName   对方店铺名称模糊筛选（可选）
     * @param type        传 4 返回空列表（历史参数）
     * @param couponType  1=仅满减，2=仅折扣，null=全部
     */
    List<LifeDiscountCouponFriendRuleVo> getReceivedSendFriendCouponList(String storeUserId, Integer queryType, String storeName, Integer type, Integer couponType);

    /**
     * 好评送券：用户好评且AI审核通过后，按运营活动配置的优惠券模板发放到用户券包。
     */
    int issueCouponForGoodRating(Integer userId, Integer storeId);
    
    /**
     * 好评送券：按优惠券模板 ID（life_discount_coupon）发放到用户券包（默认 1 张）。
     */
    int issueCouponForGoodRating(Integer userId, Integer storeId, Integer couponId);

    /**
     * 好评送券：按运营活动 {@code couponQuantity} 写入对应张数用户券；{@code null} 按 1 张（兼容旧数据），{@code 0} 或负数表示不发。
     */
    int issueCouponForGoodRating(Integer userId, Integer storeId, Integer couponId, Integer couponQuantity);
}
