package com.yami.shop.service;


import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yami.shop.bean.dto.OrderRefundDto;
import com.yami.shop.bean.model.Order;
import com.yami.shop.bean.model.OrderRefund;
import com.yami.shop.bean.model.RefundDelivery;
import com.yami.shop.bean.param.OrderRefundCountParam;
import com.yami.shop.bean.param.OrderRefundParam;
import com.yami.shop.bean.param.OrderRefundStaisticsParam;
import com.yami.shop.bean.param.StatisticsRefundParam;
import com.yami.shop.bean.vo.OrderRefundVo;
import com.yami.shop.common.util.PageParam;
import com.yami.shop.common.util.R;
import com.yami.shop.common.util.hb.HBR;
import org.apache.ibatis.annotations.Param;

import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

public interface OrderRefundService extends IService<OrderRefund> {

    /**
     * 获取分页列表
     * @param page 分页对象
     * @return 分页对象
     */
    IPage<OrderRefundDto> getPage(Page page, OrderRefundDto orderRefundDto, String startTime, String endTime);

    /**
     * 根据编码查询退款单信息
     * @param refundSn 退款单编码
     * @return 退款包装对象
     */
    OrderRefundDto getOrderRefundByRefundSn(String refundSn);

    /**
     * 根据ID获取退款单信息
     * @param refundId 退款单ID
     * @return 退款包装对象
     */
    OrderRefundDto getOrderRefundById(Long refundId, Long shopId);

    /**
     * 根据ID获取退款单信息
     * @param  shopId 退款商家ID
     * @return 退款信息包装对象
     */
    StatisticsRefundParam getOrderRefundByShopId(Long shopId, Date startTime, Date endTime);

    /**
     * 根据ID获取分段退款单信息
     * @param  shopId 退款商家ID
     * @return 退款信息包装对象
     */
    List<StatisticsRefundParam> getOrderRefundByShopIdAndDay(Long shopId, Date startTime, Date endTime);

    /**
     * 根据商品ID获取退款信息排行
     * @param  shopId 退款商家ID
     * @return 退款信息包装对象
     */
    List<StatisticsRefundParam> getRefundRankingByProd(@Param("shopId") Long shopId, @Param("startTime") Date beginTime, @Param("endTime") Date endTime);

    /**
     * 根据退款原因获取退款信息排行
     * @param  shopId 退款商家ID
     * @return 退款信息包装对象
     */
    List<StatisticsRefundParam> getRefundRankingByReason(@Param("shopId") Long shopId, @Param("startTime") Date beginTime, @Param("endTime") Date endTime);

    /**
     * 生成退款单
     * @param orderRefund 退款对象
     */
    OrderRefund applyRefund(OrderRefund orderRefund);

    /**
     * 处理退款订单
     * @param orderRefundParam 参数对象
     */
    OrderRefundDto processRefundOrder(OrderRefundParam orderRefundParam,Long shopId);

    /**
     * 退货处理
     * @param orderRefundParam 参数对象
     */
    OrderRefundDto returnMoney(OrderRefundParam orderRefundParam,Long shopId);

    /**
     * 买家提交物流信息
     * @param orderRefund 退款单对象
     * @param refundDelivery 退款物流单对象
     */
    void submitExpress(OrderRefund orderRefund, RefundDelivery refundDelivery);

    /**
     * 系统自动退款操作（批量）
     */
    void systemAutoRefundBatch(List<OrderRefundDto> orderRefundDtoList);

    /**
     * 系统验证退款结果
     */
    void verifyRefund(OrderRefundDto orderRefundDto, String payRefundId);

    /**
     * 提交退款请求（向微信发起退款请求）
     */
    void submitWxRefund(OrderRefundDto orderRefundDto);

    /**
     * 根据订单id获取退款成功的金额
     * @param orderId
     * @return
     */
    double sumRefundSuccessAmountByOrderId(Long orderId);

    /**
     * 通过订单id获取正在处理中的退款订单信息
     */
    List<OrderRefund> getProcessingOrderRefundByOrderId(Long orderId);

    /**
     * 取消申请超时的订单，无论该超时订单处于任何状态
     */
    void cancelWhenTimeOut(List<OrderRefund> orderRefundList);

    /**
     * 校验退款时间
     * @return 订单是否在退款时间内
     */
    boolean checkRefundDate(Order order);

    /**
     * 根据订单id获取退款成功的平台金额
     * @param orderId
     * @return
     */
    double sumRefundSuccessPlatformAmountByOrderId(Long orderId);

    void overTimeRefundOrder(com.yami.shop.bean.app.param.OrderRefundParam orderRefundParam);


    //*************************** 售后接口 ***************************
    /**
     * 创建退款订单接口-推送接口
     * @param channelOrderId 海博订单单号
     * @param afterSaleOrder  退款单号
     */
    String createRefundOrder(String channelOrderId,String afterSaleOrder);

    /**
     * 退款-退款单状态同步（上行）
     * @param afterSaleOrder  退款单号
     *  退款单状态 退款单状态 10:待审核 20:处理中 30:驳回退款 40:撤销退款 60:待退货（一审同意） 65:待确认收货（二审待审核） 70:退款完成
     */
    String changeStatus(String afterSaleOrder,Integer  refundStatus);


    /**
     * 售后详情接口-回调接口
     * @param hBRequest 海博请求参数
     * @return 退款订单响应报文
     */
    HBR details(JSONObject hBRequest);

    /**
     * 售后审核接口-回调接口
     * @param hBRequest 海博请求参数
     * @return 退款订单响应报文
     */
    HBR audit(JSONObject hBRequest);


    /**
     * 售后确认接口-回调接口
     * @param hBRequest 海博请求参数
     * @return 退款订单响应报文
     */
    HBR confirmOrder(JSONObject hBRequest);

    /**
     * 部分退款接口-回调接口
     * @param hBRequest 海博请求参数
     * @return 退款订单响应报文
     */
    HBR partRefund(JSONObject hBRequest);

     void addOrderRefundRecord(Long refundId, Integer auditStatus, Integer sort, String instructions) ;
    /**
     * 创建退款结果接口-回调接口
     * @param hBRequest 海博请求参数
     * @return 退款订单响应报文
     */
    HBR createResult(JSONObject hBRequest);

    /**
     * 获取退款订单统计信息
     * @param orderRefund 退款单对象
     * @return 退款订单统计信息
     */
    OrderRefundCountParam orderRefundCount(OrderRefundStaisticsParam orderRefund);

    /**
     * 获取退款订单列表
     * @param page 分页参数
     * @param orderRefund 退款单对象
     * @return 退款订单列表
     */
    IPage<OrderRefundVo> orderRefundPage(PageParam<OrderRefund> page, OrderRefundStaisticsParam orderRefund);

    /**
     * 根据ID查询退款单
     * @param refundId  id
     */
    OrderRefundVo selectInfoById(Long refundId);

    R<String> export(OrderRefundStaisticsParam orderRefund, Long userId);

    Integer queryRemainGoodsNumber(String orderNumber);

    BigDecimal countRefundMoney(Long orderId, Integer value);
}
