package com.gxwebsoft.shop.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.gxwebsoft.common.core.web.PageResult;
import com.gxwebsoft.shop.dto.UserOrderStats;
import com.gxwebsoft.shop.dto.VerifyShopOrderDto;
import com.gxwebsoft.shop.entity.ShopOrder;
import com.gxwebsoft.shop.param.ShopOrderParam;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;

/**
 * 订单Service
 *
 * @author 科技小王子
 * @since 2025-01-11 10:45:12
 */
public interface ShopOrderService extends IService<ShopOrder> {

    /**
     * 分页关联查询
     *
     * @param param 查询参数
     * @return PageResult<ShopOrder>
     */
    PageResult<ShopOrder> pageRel(ShopOrderParam param);

    /**
     * 关联查询全部
     *
     * @param param 查询参数
     * @return List<ShopOrder>
     */
    List<ShopOrder> listRel(ShopOrderParam param);

    /**
     * 根据id查询
     *
     * @param orderId 订单号
     * @return ShopOrder
     */
    ShopOrder getByIdRel(Integer orderId);

    HashMap<String, String> createWxOrder(ShopOrder shopOrder);

    ShopOrder getByOutTradeNo(String outTradeNo);

    Boolean queryOrderByOutTradeNo(ShopOrder shopOrder);

    void updateByOutTradeNo(ShopOrder order);

    /**
     * 统计订单总金额
     *
     * @return 订单总金额
     */
    BigDecimal total();

    /**
     * 根据订单号查询订单
     *
     * @param orderNo  订单号
     * @param tenantId 租户ID
     * @return ShopOrder
     */
    ShopOrder getByOrderNo(String orderNo, Integer tenantId);

    /**
     * 同步支付状态
     *
     * @param orderNo       订单号
     * @param paymentStatus 支付状态：1=支付成功，0=支付失败
     * @param transactionId 微信交易号
     * @param payTime       支付时间
     * @param tenantId      租户ID
     * @return 是否更新成功
     */
    boolean syncPaymentStatus(String orderNo, Integer paymentStatus, String transactionId, String payTime, Integer tenantId);

    /**
     * 获取当前用户订单状态统计（一次聚合查询，避免前端用分页接口串行拉取多个状态数量）
     *
     * @param userId   用户ID
     * @param tenantId 租户ID（可为空，优先走租户插件）
     * @param type     订单类型（可为空）
     */
    UserOrderStats getUserOrderStats(Integer userId, Integer tenantId, Integer type);

    /**
     * 核销订单
     * @param verifyDto 核销码
     * @return
     */
    Boolean verifyOrder(VerifyShopOrderDto verifyDto);
}
