package shop.alien.store.service;

import shop.alien.entity.store.vo.StoreReservationListVo;

import java.util.Date;
import java.util.List;

/**
 * 商家端预约管理 服务类
 *
 * @author system
 * @since 2025-01-XX
 */
public interface StoreReservationService {

    /**
     * 查询商家端预约信息列表
     *
     * @param storeId    门店ID（必填）
     * @param status     预约状态（可选，0:待确认 1:已确认 2:已到店 3:已取消 4:未到店超时）
     * @param dateFrom   预约日期起（可选）
     * @param dateTo     预约日期止（可选）
     * @param orderStatus 订单状态（可选，0:待支付 1:待使用 2:已完成 3:已过期 4:已取消 5:已关闭 6:退款中 7:已退款 8:商家预订）
     * @param reservationUserName 预约用户姓名（可选，模糊查询）
     * @return 预约信息列表
     */
    List<StoreReservationListVo> getStoreReservationList(
            Integer storeId, Integer status, Date dateFrom, Date dateTo, Integer orderStatus, String reservationUserName);

    /**
     * 商家端取消预约
     *
     * @param reservationId 预约ID
     * @param cancelReason 取消原因（可选，限30字）
     * @return 是否成功
     */
    boolean cancelReservationByStore(Integer reservationId, String cancelReason);

    /**
     * 商家端删除预订信息
     * 只有订单状态为已取消(4)、已退款(7)、已完成(2)时才能删除
     *
     * @param reservationId 预约ID
     * @return 是否成功
     */
    boolean deleteReservationByStore(Integer reservationId);

    /**
     * 商家端加时
     * 更新预订信息的结束时间，新的结束时间 = 加时开始时间 + 加时分钟数
     *
     * @param reservationId 预约ID
     * @param addTimeStart 加时开始时间（HH:mm格式）
     * @param addTimeMinutes 加时分钟数
     * @return 是否成功
     */
    boolean addTimeByStore(Integer reservationId, String addTimeStart, Integer addTimeMinutes);

    /**
     * 商家端核销预约订单
     * 根据核销码核销，校验是否过期，更新状态，并存储到Redis
     *
     * @param verificationCode 核销码/券码（user_reservation_order.verification_code）
     * @return 是否成功
     */
    boolean verifyReservationByCode(String verificationCode);

    /**
     * 商家端退款
     * 根据预约ID进行退款处理
     *
     * @param reservationId 预约ID
     * @return 是否成功
     */
    boolean refundReservation(Integer reservationId);

    /**
     * 商家端主动退款（调用支付退款接口并发送通知和短信）
     *
     * @param storeId 门店ID
     * @param outTradeNo 商户订单号
     * @param refundAmount 退款金额（元）
     * @param refundReason 退款原因
     * @param refundType 退款类型 0:用户取消 1:商家退款 2:部分退款等 3.扫码核销成功
     * @param payType 支付类型 alipay/wechatPay
     * @return 退款结果
     */
    shop.alien.entity.result.R<String> refundByOrder(Integer storeId, String outTradeNo, String refundAmount,
                                                       String refundReason, Integer refundType, String payType);

    /**
     * 通过预订订单ID退款（根据订单查出门店、商户订单号、金额、支付方式后调用支付退款，成功时发送通知和短信）
     *
     * @param orderId     预订订单ID（user_reservation_order.id）
     * @param refundReason 退款原因，可选
     * @param refundType   退款类型，可选，默认 1-商家退款
     * @return 退款结果
     */
    shop.alien.entity.result.R<String> refundByOrderId(Integer orderId, String refundReason, Integer refundType);

    /**
     * 定时任务：查询支付状态为「退款中」的订单并重试退款（不发送短信和通知）
     *
     * @return 本次退款成功的订单数
     */
    int retryRefundFailedOrders();

    /**
     * 发送订金退款短信和通知
     * 根据预约ID查询预约和订单信息，然后发送退款短信和通知
     *
     * @param reservationId 预约ID
     * @return 是否成功
     */
    boolean sendDepositRefundSmsAndNotice(Integer reservationId);
}
