package shop.alien.dining.service;

import shop.alien.entity.store.dto.AddCartItemDTO;
import shop.alien.entity.store.dto.CartDTO;

/**
 * 购物车服务接口
 *
 * @author system
 * @since 2025-01-XX
 */
public interface CartService {

    /**
     * 获取购物车
     *
     * @param tableId 桌号ID
     * @return 购物车信息
     */
    CartDTO getCart(Integer tableId);

    /**
     * 添加商品到购物车
     *
     * @param dto 添加购物车商品DTO
     * @return 购物车信息
     */
    CartDTO addItem(AddCartItemDTO dto);

    /**
     * 更新购物车商品数量
     *
     * @param tableId   桌号ID
     * @param cuisineId 菜品ID
     * @param quantity  数量
     * @return 购物车信息
     */
    CartDTO updateItemQuantity(Integer tableId, Integer cuisineId, Integer quantity);

    /**
     * 删除购物车商品
     *
     * @param tableId   桌号ID
     * @param cuisineId 菜品ID
     * @return 购物车信息
     */
    CartDTO removeItem(Integer tableId, Integer cuisineId);

    /**
     * 清空购物车
     *
     * @param tableId 桌号ID
     */
    void clearCart(Integer tableId);

    /**
     * 换桌时迁移购物车
     *
     * @param fromTableId 原桌号ID
     * @param toTableId   目标桌号ID
     * @return 迁移后的购物车信息
     */
    CartDTO migrateCart(Integer fromTableId, Integer toTableId);

    /**
     * 检查桌号是否已使用优惠券
     *
     * @param tableId 桌号ID
     * @return true-已使用, false-未使用
     */
    boolean hasUsedCoupon(Integer tableId);

    /**
     * 标记桌号已使用优惠券
     *
     * @param tableId  桌号ID
     * @param couponId 优惠券ID
     */
    void markCouponUsed(Integer tableId, Integer couponId);

    /**
     * 清除桌号优惠券使用标记(换桌时使用)
     *
     * @param tableId 桌号ID
     */
    void clearCouponUsed(Integer tableId);

    /**
     * 设置用餐人数（自动添加或更新餐具）
     *
     * @param tableId   桌号ID
     * @param dinerCount 用餐人数
     * @return 购物车信息
     */
    CartDTO setDinerCount(Integer tableId, Integer dinerCount);

    /**
     * 更新餐具数量
     *
     * @param tableId 桌号ID
     * @param quantity 餐具数量
     * @return 购物车信息
     */
    CartDTO updateTablewareQuantity(Integer tableId, Integer quantity);

    /**
     * 锁定购物车商品数量（下单时调用，将当前数量锁定，不允许减少或删除）
     *
     * @param tableId 桌号ID
     * @return 购物车信息
     */
    CartDTO lockCartItems(Integer tableId);

    /**
     * 解锁购物车商品数量（取消订单时调用，清除已下单数量，允许重新下单）
     *
     * @param tableId 桌号ID
     * @return 购物车信息
     */
    CartDTO unlockCartItems(Integer tableId);
}
