package com.haha.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.haha.entity.Refund;
import com.haha.entity.RefundItem;

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

public interface RefundService extends IService<Refund> {

    /**
     * 创建退款记录（含商品明细）
     *
     * @param orderId       订单ID
     * @param reason        退款原因
     * @param products      退款商品列表（可选）
     * @param refundAmount  自定义退款金额（可选）
     * @param restoreStock  退款后是否恢复库存：true=恢复（默认），false=不恢复
     * @return 退款记录
     */
    Refund createRefundRecord(Long orderId, String reason, List<Map<String, Object>> products, BigDecimal refundAmount, Boolean restoreStock);

    /**
     * 从Map参数创建退款记录
     */
    Refund createRefundRecord(Map<String, Object> params);

    /**
     * 查询退款详情
     */
    Refund getDetailById(Long refundId);

    /**
     * 查询订单的每个商品已退款数量（仅统计 REFUNDED 状态的退款）
     * @return Map<orderGoodsId, 已退款总数量>
     */
    Map<Long, Integer> getRefundedQuantityMap(Long orderId);

    /**
     * 批量查询多个订单的已退款商品数量
     * @return Map<orderId, Map<orderGoodsId, 已退款总数量>>
     */
    Map<Long, Map<Long, Integer>> getRefundedQuantityMapByOrderIds(List<Long> orderIds);

    /**
     * 查询订单的所有退款记录
     */
    List<Refund> getByOrderId(Long orderId);

    /**
     * 分页查询退款列表
     */
    IPage<Refund> getRefundPage(int page, int pageSize, String orderNo,
                                String status, String startDate, String endDate);

    /**
     * 查询退款商品明细
     */
    List<RefundItem> getRefundItems(Long refundId);

    /**
     * 根据订单ID查询累计退款金额（已退款状态的记录）
     */
    BigDecimal getTotalRefundedAmount(Long orderId);

    /**
     * 计算退款金额（从商品列表）
     */
    BigDecimal calculateRefundAmount(List<Map<String, Object>> products);

    /**
     * 审核通过退款（执行第三方退款）
     */
    boolean approveRefund(Long refundId, String remark, Long reviewerId);

    /**
     * 拒绝退款
     */
    boolean rejectRefund(Long refundId, String remark, Long reviewerId);

    /**
     * 标记退款已成功
     */
    void markRefunded(Long refundId, String transactionId);
}
