package shop.alien.store.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import shop.alien.entity.store.LifeDiscountCoupon;
import shop.alien.entity.store.UserLoginInfo;
import shop.alien.entity.store.dto.LifeDiscountCouponDto;
import shop.alien.entity.store.vo.LifeCouponStatusVo;
import shop.alien.entity.store.vo.LifeDiscountCouponPlatformVo;
import shop.alien.entity.store.vo.LifeDiscountCouponUserWebVo;
import shop.alien.entity.store.vo.LifeDiscountCouponVo;

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

/**
 * <p>
 * 优惠券表 服务类
 * </p>
 *
 * @author ssk
 * @since 2025-02-07
 */
public interface LifeDiscountCouponService extends IService<LifeDiscountCoupon> {

    /**
     * 新增门店优惠券（仅 life_discount_coupon：满减/折扣；不创建 life_coupon 代金券）
     */
    boolean addDiscountCoupon(LifeDiscountCouponDto lifeDiscountCouponDto);

    /**
     * 修改优惠券
     */
    boolean editDiscountCoupon(LifeDiscountCouponDto lifeDiscountCouponDto);

    /**
     * 删除优惠券
     */
    boolean deleteDiscountCoupon(Integer id);

    /**
     * 切换优惠券进行状态
     */
    boolean cutDiscountCouponStatus(String counponId);

    /**
     * 获取该优惠券的明细信息
     */
    LifeDiscountCouponVo getCounponDetailById(String counponId, UserLoginInfo userLoginInfo);

    /**
     * 优惠券详情 + 好友赠券场景下本店铺作为送出方已向好友发放的合计数量（release_type=1）：
     * 对 life_discount_coupon_store_friend 中 friend_store_user_id 为本店任一 store_user.id 的记录，汇总 single_qty。
     *
     * @param couponId 优惠券主键 life_discount_coupon.id
     * @param storeId  店铺 id（store_info.id）
     * @return 详情 VO，含 ownedQuantity；券不存在或参数非法时返回 null
     */
    LifeDiscountCouponVo getCouponDetailWithFriendOwnedQty(String couponId, String storeId);

    /**
     * 获取该用户该店铺优惠券列表
     * @param couponType 优惠券类型：1=满减券，2=折扣券，null=全部优惠券
     */
    List<LifeDiscountCouponVo> getStoreUserCouponList(String storeId, UserLoginInfo userLoginInfo, Integer couponType);

    /**
     * 获取该用户该店铺优惠券已领可用不可用列表
     * @param couponType 优惠券类型：1=满减券，2=折扣券，null=全部优惠券
     */
    Map getStoreUserUsableCouponList(String storeId, UserLoginInfo userLoginInfo, BigDecimal amount, Integer couponType);

    /**
     * 获取该用户优惠券列表
     * @param type 不传或1：仅用户优惠券（life_discount_coupon）；4 已不再支持
     * @param couponType 优惠券类型：1=满减券，2=折扣券，null=全部
     * @param storeId 商铺ID，可为空，传则仅返回该商铺的优惠券
     * @param storeKeyword 店铺名称关键字，非空时仅返回门店名称包含该关键字的券（与 storeId 可同时生效）
     */
    List<LifeDiscountCouponVo> getUserCouponList(UserLoginInfo userLoginInfo, int page, int size, String tabType, Integer type, Integer couponType, String storeId, String storeKeyword);

    /**
     * 获取所有优惠券列表（分页）
     */
    IPage<LifeDiscountCouponVo> getStoreAllCouponList(String storeId, UserLoginInfo userLoginInfo, int page, int size, String couponName, String tab, int couponsFromType, int couponStatus, Integer couponType);

    /**
     * 获取所有优惠券列表（不分页）
     * @param type 类型：1-优惠券（默认），4-代金券
     */
    List<LifeDiscountCouponVo> getStoreAllCouponListPaginateNot(String status, String storeId, UserLoginInfo userLoginInfo, int couponStatus, Integer type, Integer couponType);

    /**
     * 获取优惠券规则
     */
    /**
     * 获取优惠券/代金券使用规则
     * @param type 不传：优惠券与代金券规则都返回；1：仅优惠券；4：仅代金券
     */
    String getCouponRule(String couponId, UserLoginInfo userLoginInfo, Integer type,String voucherId);

    /**
     * 获取优惠券状态
     */
    LifeCouponStatusVo getCouponStatus(String couponId);

    /**
     * 获取平台优惠券列表
     *
     * @param pageNum    分页页码
     * @param pageSize   分页大小
     * @param name       优惠券名称
     * @param createDate 创建时间
     * @param couponType 类型:(1:优惠券, 2:红包, 3:平台优惠券)
     * @return IPage<LifeDiscountCouponPlatformVo>
     */
    IPage<LifeDiscountCoupon> getPlatformCouponList(Integer pageNum, Integer pageSize, String name, String createDate, Integer couponType);

    /**
     * 新增平台优惠券
     *
     * @param lifeDiscountCoupon 优惠券实体
     * @return boolean
     */
    boolean addPlatformCoupon(@RequestBody LifeDiscountCoupon lifeDiscountCoupon);


    /**
     * 查询平台优惠券详情
     *
     * @param id 柱间, 妈的就叫这个吧! 哈西辣妈!
     * @return LifeDiscountCouponPlatformVo
     */
    LifeDiscountCoupon getOnePlatformCoupon(Integer id);

    /**
     * 发放平台优惠券
     *
     * @param userIds  用户主键List
     * @param couponId 优惠券id
     * @return boolean
     */
    boolean issuePlatformCoupon(List<Integer> userIds, Integer couponId);

    /**
     * 收回平台优惠券
     *
     * @param couponId 优惠券id
     * @return boolean
     */
    boolean recoverPlatformCoupon(Integer couponId);

    /**
     * 删除平台优惠券
     *
     * @param couponId 优惠券id
     * @return boolean
     */
    boolean deletePlatformCoupon(Integer couponId);

    /**
     * 分页查询该券发放记录
     *
     * @param pageNum  分页页码
     * @param pageSize 分页大小
     * @param userName 用户名
     * @param phone    手机号
     * @param couponId 优惠券id
     * @return IPage<LifeDiscountCouponUserWebVo>
     */
    IPage<LifeDiscountCouponUserWebVo> getPlatformCouponLogList(Integer pageNum, Integer pageSize, String userName, String phone, Integer couponId);

    /**
     * 查询平台优惠券
     *
     * @param couponType 优惠券类型
     * @return List<LifeDiscountCoupon>
     */
    List<LifeDiscountCoupon> getPlatformCoupon(Integer couponId, Integer couponType);
}
