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

import com.jeesharp.business.modules.coupon.dto.CouponCheckoutContextDTO;
import com.jeesharp.business.modules.coupon.entity.MemberCoupon;
import com.jeesharp.business.modules.coupon.vo.CouponCheckoutListVO;
import com.jeesharp.business.modules.coupon.vo.CouponDemoVO;
import com.jeesharp.business.modules.coupon.vo.CouponTemplateQueryVO;
import com.jeesharp.business.modules.coupon.vo.MemberCouponInfoVO;
import com.jeesharp.business.modules.coupon.vo.MemberCouponListVO;
import com.jeesharp.business.modules.coupon.vo.MemberCouponQueryVO;
import com.jeesharp.framework.pojo.Page;
import com.jeesharp.framework.pojo.query.PageRespVO;

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

/**
 * 小程序优惠券 C 端 API；由 {@code business-coupon-application} 实现，网关仅依赖本接口。
 *
 * @author jeesharp
 * @since 2026-06-08
 */
public interface MemberCouponMobileApi {

    PageRespVO<CouponDemoVO> pageTemplateDemos(String memberId, CouponTemplateQueryVO pageParam);

    List<CouponDemoVO> listPublishedTemplatesForDemo(String memberId);

    CouponDemoVO getTemplateDemo(String templateId, String memberId);

    CouponDemoVO getMemberCouponDemo(String memberCouponId, String memberId);

    PageRespVO<MemberCouponListVO> pageMyCoupons(String memberId, Page<MemberCoupon> page, MemberCouponQueryVO query);

    MemberCouponInfoVO getMemberCouponInfo(String memberId, String couponId);

    Map<String, Object> receiveManual(String memberId, String templateId);

    Map<String, Object> exchangeByPoints(String memberId, String templateId);

    CouponCheckoutListVO usableForCheckout(CouponCheckoutContextDTO context);

    /**
     * 店铺线下可领券模板（按租户 + STORE_OFFLINE 场景）。
     */
    PageRespVO<CouponDemoVO> pageStoreOfflineTemplates(String memberId, String tenantId, CouponTemplateQueryVO pageParam);

    /**
     * 领取店铺线下券（校验模板归属租户与场景）。
     */
    Map<String, Object> receiveStoreOfflineCoupon(String memberId, String tenantId, String templateId);

    /**
     * 我的店铺线下券列表。
     */
    PageRespVO<MemberCouponListVO> pageStoreOfflineMyCoupons(String memberId, String tenantId, Page<MemberCoupon> page, MemberCouponQueryVO query);

    /**
     * 店铺线下券详情。
     */
    MemberCouponInfoVO getStoreOfflineMemberCouponInfo(String memberId, String tenantId, String memberCouponId);

    /**
     * 店铺线下券卡面详情。
     */
    CouponDemoVO getStoreOfflineMemberCouponDemo(String memberId, String tenantId, String memberCouponId);
}
