package com.jeesharp.business.modules.food.service;

import com.jeesharp.business.modules.food.dto.FoodBookingRefundDTO;
import com.jeesharp.business.modules.food.entity.FoodBookingOrder;
import com.jeesharp.business.modules.food.vo.FoodBookingResultVO;
import com.jeesharp.business.modules.food.vo.FoodBookingOrderQueryVO;
import com.jeesharp.framework.mybatis.core.service.BaseInterface;

import java.time.LocalDateTime;

/**
 * 美食预订单领域服务接口：落库、结果查询、到店核销及支付状态变迁。
 *
 * @author jeesharp
 * @since 2026-05-08
 */
public interface FoodBookingOrderService extends BaseInterface<FoodBookingOrder, FoodBookingOrderQueryVO> {

    void createOrder(FoodBookingOrder entity);

    void updateOrder(FoodBookingOrder entity);

    /**
     * 插入已组装的美食预订单（Application 完成校验与库存扣减后调用）。
     */
    FoodBookingOrder insertBooking(FoodBookingOrder order);

    /**
     * 按垂直单主键组装小程序成功页/详情展示 VO。
     */
    FoodBookingResultVO getBookingResult(String orderId);

    /**
     * 按垂直单号 / 交易号 / 统一单号解析预订单。
     */
    FoodBookingOrder findByOrderRef(String orderRef);

    /**
     * 按核销码查询预订单（未删除）。
     */
    FoodBookingOrder getByVerifyCode(String verifyCode);

    /**
     * 管理端到店核销：校验核销码与「待使用」状态，置为已使用并记录核销时间。
     */
    void verifyConsumeByVerifyCode(String verifyCode);

    /**
     * 管理端确认退款完成：将待使用预订单置为已退款。
     */
    void markRefunded(FoodBookingRefundDTO dto);

    /**
     * 校验当前订单可发起预支付。
     */
    void assertPayPreparable(FoodBookingOrder order);

    /**
     * 写入预支付中状态并持久化。
     */
    void markPayPreparing(FoodBookingOrder order, String payChannel, String payOrderId, LocalDateTime expireTime);

    /**
     * 支付成功：更新状态、刷新结果 JSON 并返回展示 VO。
     */
    FoodBookingResultVO markPaySuccess(FoodBookingOrder order, String payOrderId, String thirdPartyTradeNo);

    /**
     * 取消预约：领域状态变迁并持久化。
     */
    void markCancelled(FoodBookingOrder order, String cancelReason);
}
