package shop.alien.dining.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import shop.alien.entity.result.R;
import shop.alien.entity.store.vo.LifeDiscountCouponVo;

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

/**
 * 点餐模块-优惠券服务（Feign 调 store 优惠券接口，供小程序使用）
 *
 * @author ssk
 * @version 1.0
 * @date 2025/1/29
 */
public interface DiningCouponService {

    /**
     * 获取当前用户优惠券列表（分 tab）
     *
     * @param authorization 请求头 Authorization，透传至 store 解析用户
     * @param page          页码
     * @param size          每页条数
     * @param tabType       0：全部（未使用），1：即将过期，2：已使用，3：已过期
     * @param type          券类型（不传：优惠券+代金券都返回，1：仅优惠券查 life_discount_coupon，4：仅代金券查 life_coupon）（可选）
     * @param couponType    优惠券类型：1=仅满减券，2=仅折扣券，不传=全部优惠券（可选，仅当type不为4时有效）
     * @param storeId       商铺ID（可选）；传则 store 侧仅返回该商铺的优惠券
     * @param storeKeyword   店铺名称关键字（可选）；非空时仅门店名称包含关键字的券
     * @return R.data 为 List&lt;LifeDiscountCouponVo&gt;
     */
    R<List<LifeDiscountCouponVo>> getUserCouponList(String authorization, int page, int size, String tabType, Integer type, Integer couponType, String storeId, String storeKeyword);

    /**
     * 根据优惠券 id 获取优惠券详情
     *
     * @param authorization 请求头 Authorization
     * @param counponId     优惠券 id（与 store 接口拼写一致）
     * @return R.data 为 LifeDiscountCouponVo
     */
    R<LifeDiscountCouponVo> getCounponDetailById(String authorization, String counponId);

    /**
     * 获取该门店下用户可用/不可用优惠券列表（按消费金额区分，用于选券）
     * couponType=1仅满减券，couponType=2仅折扣券，不传返回全部优惠券
     *
     * @param authorization 请求头 Authorization
     * @param storeId        门店 id
     * @param amount         当前消费金额（满减门槛）
     * @param couponType     优惠券类型：1=仅满减券，2=仅折扣券，不传=全部优惠券（可选）
     * @return R.data 为 Map：canUseLifeDiscountCouponVos、forbidUseLifeDiscountCouponVos
     */
    R<Map<String, Object>> getStoreUserUsableCouponList(String authorization, String storeId, BigDecimal amount, Integer couponType);

    /**
     * 查询用户拥有的优惠券：每张用户券一条；未过期待使用；可选按门店过滤。
     * 传入的 {@code amount} <strong>只影响排序</strong>（无门槛券需传入 {@code amount &gt; 0} 才参与「可满足」的比较；满足的优先，同等再比估算优惠）。
     *
     * @param storeId 门店ID（可选，如果提供则只查询该门店的优惠券）
     * @param amount  可选；当前订单/消费金额参考值，用于排序对比门槛与折算优惠金额，不改变返回条数
     * @return 优惠券列表
     */
    R<List<LifeDiscountCouponVo>> getUserOwnedCoupons(String storeId, BigDecimal amount);

    /**
     * 获取该用户该店铺优惠券列表
     * couponType=1仅满减券，couponType=2仅折扣券，不传返回全部优惠券
     *
     * @param authorization 请求头 Authorization，透传至 store 解析用户
     * @param storeId       商户id
     * @param couponType    优惠券类型：1=仅满减券，2=仅折扣券，不传=全部优惠券（可选）
     * @return R.data 为 List&lt;LifeDiscountCouponVo&gt;
     */
    R<List<LifeDiscountCouponVo>> getStoreUserCouponList(String authorization, String storeId, Integer couponType);

    /**
     * 获取该店铺所有优惠券（分页）, 好友优惠券
     * couponType=1仅满减券，couponType=2仅折扣券，不传返回全部优惠券
     *
     * @param authorization   请求头 Authorization，透传至 store 解析用户
     * @param page            页码（默认1）
     * @param size            每页条数（默认10）
     * @param storeId         商户id
     * @param couponName      优惠券名称（可选）
     * @param tab             分页类型(0:全部，1:进行中，2:已结束，3:草稿，4:未开始，5:已下架，6:已清库)
     * @param couponsFromType 查询类型(1:我的优惠券，2:好友的优惠券)（默认1）
     * @param couponStatus    优惠券状态(0:草稿，1:正式)（默认1）
     * @param couponType      优惠券类型：1=仅满减券，2=仅折扣券，不传=全部优惠券（可选）
     * @return R.data 为 IPage&lt;LifeDiscountCouponVo&gt;
     */
    R<IPage<LifeDiscountCouponVo>> getStoreAllCouponList(String authorization, int page, int size, String storeId,
                                                          String couponName, String tab, int couponsFromType,
                                                          int couponStatus, Integer couponType);

    /**
     * 查询用户目前所拥有的优惠券（可通过商铺ID进行查询）
     *
     * @param storeId     商铺ID（可选，如果提供则只查询该商铺的优惠券）
     * @param couponType  优惠券类型：1=仅满减券，2=仅折扣券，不传=全部优惠券（可选）
     * @return 优惠券列表
     */
    R<List<LifeDiscountCouponVo>> getUserOwnedCouponsByStore(String storeId, Integer couponType);
}
