package com.starry.admin.modules.shop.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity;
import com.starry.admin.modules.shop.module.entity.PlayCouponInfoEntity;
import com.starry.admin.modules.shop.module.enums.CouponObtainChannel;
import com.starry.admin.modules.shop.module.vo.PlayCouponInfoQueryVo;
import com.starry.admin.modules.shop.module.vo.PlayCouponInfoReturnVo;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 优惠券信息Service接口
 *
 * @author admin
 * @since 2024-07-04
 */
public interface IPlayCouponInfoService extends IService<PlayCouponInfoEntity> {

    /**
     * 获取优惠券不可用的原因
     *
     * @param couponInfo
     *            优惠券信息
     * @param placeType
     *            下单类型
     * @param commodityId
     *            商品ID
     * @param commodityQuantity
     *            商品数量
     * @param price
     *            商品单价
     * @return 不可用原因
     */
    String getCouponReasonForUnavailableUse(PlayCouponInfoEntity couponInfo, String placeType, String commodityId,
            Integer commodityQuantity, BigDecimal price);

    /**
     * 获取优惠券在状态层面的不可用原因（如已使用、已过期等）。
     *
     * @param couponInfo
     *            优惠券信息
     * @param useState
     *            优惠券详情使用状态
     * @param obtainingTime
     *            优惠券领取时间
     * @return 不可用原因
     */
    Optional<String> getCouponDetailRestrictionReason(
            PlayCouponInfoEntity couponInfo,
            String useState,
            LocalDateTime obtainingTime);

    /**
     * 顾客领取优惠券，校验库存与限领并生成明细。
     */
    void claimCouponForCustom(String couponId, PlayCustomUserInfoEntity customUserInfo, CouponObtainChannel obtainChannel);

    /**
     * 获取优惠券不可领取的原因
     *
     * @param entity
     *            优惠券实体
     * @param customUserInfo
     *            顾客实体
     * @return String
     * @author admin
     * @since 2024/7/8 14:44
     **/
    String getReasonForNotObtainingCoupons(PlayCouponInfoEntity entity, PlayCustomUserInfoEntity customUserInfo);

    /**
     * 查询优惠券信息
     *
     * @param id
     *            优惠券信息主键
     * @return 优惠券信息
     */
    PlayCouponInfoEntity selectPlayCouponInfoById(String id);

    /**
     * 查询优惠券信息列表
     *
     * @param vo
     *            优惠券分页查询实体
     * @return 优惠券信息集合
     */
    IPage<PlayCouponInfoReturnVo> selectByPage(PlayCouponInfoQueryVo vo);

    /**
     * 查询优惠券信息列表
     *
     * @return 优惠券信息集合
     */
    List<PlayCouponInfoEntity> queryAll();

    /**
     * 查询优惠券信息列表
     *
     * @param playCouponInfo
     *            优惠券信息
     * @return 优惠券信息集合
     */
    IPage<PlayCouponInfoEntity> selectPlayCouponInfoByPage(PlayCouponInfoEntity playCouponInfo);

    /**
     * 新增优惠券信息
     *
     * @param playCouponInfo
     *            优惠券信息
     * @return 结果
     */
    boolean create(PlayCouponInfoEntity playCouponInfo);

    /**
     * 修改优惠券信息
     *
     * @param playCouponInfo
     *            优惠券信息
     * @return 结果
     */
    boolean update(PlayCouponInfoEntity playCouponInfo);

    /**
     * 批量删除优惠券信息
     *
     * @param ids
     *            需要删除的优惠券信息主键集合
     * @return 结果
     */
    int deletePlayCouponInfoByIds(String[] ids);

    /**
     * 删除优惠券信息信息
     *
     * @param id
     *            优惠券信息主键
     * @return 结果
     */
    int deletePlayCouponInfoById(String id);
}
