package shop.alien.dining.service;

import shop.alien.entity.store.vo.TableDiningStatusVO;
import shop.alien.entity.store.vo.*;

import java.util.List;

/**
 * 点餐服务接口
 *
 * @author system
 * @since 2025-01-XX
 */
public interface DiningService {

    /**
     * 查询餐桌是否处于就餐中（就餐人数是否有数据），免登录可调用
     *
     * @param tableId 桌号ID
     * @return 就餐状态（inDining、dinerCount）
     */
    TableDiningStatusVO getTableDiningStatus(Integer tableId);

    /**
     * 获取点餐页面信息
     *
     * @param tableId 桌号ID
     * @param dinerCount 就餐人数
     * @return 点餐页面信息
     */
    DiningPageInfoVO getDiningPageInfo(Integer tableId, Integer dinerCount);

    /**
     * 搜索菜品(模糊搜索，限10字)
     *
     * @param storeId 门店ID
     * @param keyword 搜索关键词
     * @param tableId 桌号ID(用于获取购物车数量)
     * @return 菜品列表
     */
    List<CuisineListVO> searchCuisines(Integer storeId, String keyword, Integer tableId);

    /**
     * 根据分类获取菜品列表
     *
     * @param storeId 门店ID
     * @param categoryId 分类ID(可为空，查询所有)
     * @param tableId 桌号ID(用于获取购物车数量)
     * @param page 页码(默认1)
     * @param size 每页数量(默认12)
     * @return 菜品列表
     */
    List<CuisineListVO> getCuisinesByCategory(Integer storeId, Integer categoryId, Integer tableId, Integer page, Integer size);

    /**
     * 获取菜品详情
     *
     * @param cuisineId 菜品ID
     * @param tableId 桌号ID(用于获取购物车数量)
     * @return 菜品详情
     */
    CuisineDetailVO getCuisineDetail(Integer cuisineId, Integer tableId);

    /**
     * 获取可领取的优惠券列表
     *
     * @param storeId 门店ID
     * @param userId 用户ID
     * @return 可领取优惠券列表
     */
    List<AvailableCouponVO> getAvailableCoupons(Integer storeId, Integer userId);

    /**
     * 领取优惠券
     *
     * @param couponId 优惠券ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean receiveCoupon(Integer couponId, Integer userId);

    /**
     * 获取订单确认页面信息
     *
     * @param tableId 桌号ID
     * @param dinerCount 就餐人数
     * @param userId 用户ID
     * @return 订单确认页面信息
     */
    OrderConfirmVO getOrderConfirmInfo(Integer tableId, Integer dinerCount, Integer userId);

    /**
     * 锁定订单(防止多人同时下单)
     *
     * @param tableId 桌号ID
     * @param userId 用户ID
     * @return 是否锁定成功
     */
    boolean lockOrder(Integer tableId, Integer userId);

    /**
     * 解锁订单
     *
     * @param tableId 桌号ID
     * @param userId 用户ID
     */
    void unlockOrder(Integer tableId, Integer userId);

    /**
     * 检查订单是否被锁定
     *
     * @param tableId 桌号ID
     * @return 锁定用户ID，如果未锁定返回null
     */
    Integer checkOrderLock(Integer tableId);

    /**
     * 获取订单结算确认页面信息
     *
     * @param orderId 订单ID
     * @param userId 用户ID
     * @return 订单结算确认页面信息
     */
    shop.alien.entity.store.vo.OrderSettlementVO getOrderSettlementInfo(Integer orderId, Integer userId);

    /**
     * 锁定订单结算(防止多人同时结算)
     *
     * @param orderId 订单ID
     * @param userId 用户ID
     * @return 是否锁定成功
     */
    boolean lockSettlement(Integer orderId, Integer userId);

    /**
     * 解锁订单结算
     *
     * @param orderId 订单ID
     * @param userId 用户ID
     */
    void unlockSettlement(Integer orderId, Integer userId);

    /**
     * 检查订单结算是否被锁定
     *
     * @param orderId 订单ID
     * @return 锁定用户ID，如果未锁定返回null
     */
    Integer checkSettlementLock(Integer orderId);
}
