package cn.ysk.cashier.mybatis.service;

import cn.ysk.cashier.cons.TableConstant;
import cn.ysk.cashier.dto.shoptable.ShopEatTypeInfoDTO;
import cn.ysk.cashier.enums.OrderStatusEnums;
import cn.ysk.cashier.pojo.order.TbCashierCart;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;

/**
 * (TbShopPermission)表服务接口
 *
 * @author makejava
 * @since 2024-09-14 17:08:48
 */
public interface MpCashierCartService extends IService<TbCashierCart> {

    /**
     * 根据取餐码获取购物车信息
     * @param masterId 取餐码
     * @param shopId 店铺id
     * @return 购物车信息
     */
    List<TbCashierCart> selectTakeoutCart(String masterId, Integer shopId);

    /**
     * 查询无台桌购物车商品
     * @param masterId 取餐码
     * @param shopId 店铺did
     */
    List<TbCashierCart> selectUnTableCart(String masterId, Integer shopId);


    /**
     * 统计当前台桌购物车数量
     * @param shopId 店铺id
     * @param tableId 台桌id
     * @param statusEnums 状态，可不传查询所有
     * @return 购物车数量
     */
    long countByTableId(Integer shopId, String tableId, OrderStatusEnums... statusEnums);

    /**
     * 根据tableIdId和用餐类型清空购物车
     *
     * @param tableId 台桌id
     * @param useType 用餐类型
     * @param shopId  店铺id
     */
    boolean clearCartByTableIdAndUseType(String tableId, String useType, Integer shopId);

    /**
     * 根据订单id更改购物车状态
     * @param status 状态
     * @param orderId 订单id
     */
    boolean updateStateByOrderId(TableConstant.OrderInfo.Status status, Integer orderId);

    /**
     * 根据店就餐模式查询购物车
     * @param shopEatTypeInfoDTO 就餐模式
     * @param masterId 取餐码
     * @param statuses 状态 为空默认查询 create return
     * @return 购物车信息
     */
    List<TbCashierCart> selectByShopEatType(ShopEatTypeInfoDTO shopEatTypeInfoDTO, String masterId, TableConstant.OrderInfo.Status... statuses);

    /**
     * 根据订单id和状态获取购物车数据
     * @param orderId 订单id
     * @param status 状态 可为空
     */
    List<TbCashierCart> selectByOrderIdAndState(Integer orderId, TableConstant.OrderInfo.Status... status);


    boolean updateMemberAndAmountByOrderId(Integer orderId, boolean isMember);

    /**
     * 根据就餐信息查询购物车信息
     * @param shopEatTypeInfoDTO 就餐信息
     * @return 购物车信息
     */
    TbCashierCart selectOneCartByShopEatType(ShopEatTypeInfoDTO shopEatTypeInfoDTO, String masterId, Integer productId, Integer skuId, boolean isGift, boolean isTemp);

    /**
     * 根据店铺id和购物车id查询信息
     * @param shopId 店铺id
     * @param cartId 购物车id
     * @param statuses 状态
     */
    TbCashierCart selectByShopIdAndId(Integer shopId, Integer cartId, TableConstant.OrderInfo.Status... statuses);
}

