package shop.alien.store.service;

import com.baomidou.mybatisplus.extension.service.IService;
import shop.alien.entity.store.MerchantPaymentOrder;

import java.util.List;

/**
 * 商户支付单表 服务类
 *
 * @author system
 */
public interface MerchantPaymentOrderService extends IService<MerchantPaymentOrder> {

    /**
     * 根据商户订单号查询支付单
     *
     * @param outTradeNo 商户订单号
     * @return 支付单，不存在返回 null
     */
    MerchantPaymentOrder getByOutTradeNo(String outTradeNo);

    /**
     * 根据业务订单ID查询待支付支付单（pay_status=0），用于预订页展示 outTradeNo 供前端轮询
     *
     * @param orderId user_reservation_order.id
     * @return 待支付单，不存在或已支付返回 null
     */
    MerchantPaymentOrder getUnpaidByOrderId(Integer orderId);

    /**
     * 根据业务订单ID查询已支付支付单（pay_status=1），用于按订单退款时获取 payType 等
     *
     * @param orderId user_reservation_order.id
     * @return 已支付单，不存在返回 null
     */
    MerchantPaymentOrder getPaidByOrderId(Integer orderId);

    /**
     * 查询近期创建的待支付单（用于无异步回调时的后端轮询同步）
     *
     * @param withinMinutes 在最近多少分钟内创建的
     * @return 待支付且未删除的支付单列表，按创建时间升序
     */
    List<MerchantPaymentOrder> listUnpaidRecent(int withinMinutes);

    /**
     * 生成支付单号，格式：PAY + yyyyMMddHHmmss + 4位随机
     *
     * @return 支付单号
     */
    String generatePaymentNo();

    /**
     * 按订单ID将支付单逻辑删除（delete_flag=1）
     *
     * @param orderId 业务订单ID user_reservation_order.id
     * @return 更新的条数
     */
    int logicDeleteByOrderId(Integer orderId);

    /**
     * 按订单ID与支付类型将支付单逻辑删除（未命中缓存重新预支付时，仅删除同 pay_type 的支付单）
     *
     * @param orderId 业务订单ID
     * @param payType 支付类型，如 alipay、wechat
     * @return 更新的条数
     */
    int logicDeleteByOrderIdAndPayType(Integer orderId, String payType);
}
