package com.seer.teach.mall.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.seer.teach.common.PageListBean;
import com.seer.teach.common.enums.AfterSaleStatusEnum;
import com.seer.teach.mall.entity.TradeAfterSaleEntity;
import com.seer.teach.mall.request.AfterSalePageReq;
import com.seer.teach.mall.response.AfterSaleResp;

import jakarta.validation.Valid;

/**
 * 售后服务接口
 */
public interface IAfterSaleService extends IService<TradeAfterSaleEntity> {

    /**
     * 校验售后订单
     *
     * @param id 售后订单ID
     * @return 售后订单实体
     */
    TradeAfterSaleEntity checkAfterSaleOrder(Integer id);

    /**
     * 分页查询售后订单
     *
     * @param pageVO 分页参数
     * @return 分页结果
     */
    PageListBean<AfterSaleResp> queryPageList(@Valid AfterSalePageReq pageVO);

    /**
     * 获取售后订单详情
     *
     * @param id 售后订单ID
     * @param merchantUserId 商户用户ID
     * @return 售后订单详情
     */
    AfterSaleResp getTradeAfterSaleOrderDetail(Integer id, Integer merchantUserId);

    /**
     * 根据SKU ID和订单ID获取售后订单
     *
     * @param skuId SKU ID
     * @param orderId 订单ID
     * @return 售后订单实体
     */
    TradeAfterSaleEntity getListBySkuIdAndOrderId(Integer skuId, Integer orderId);

    /**
     * 处理售后申请
     *
     * @param id 售后订单ID
     * @param userId 用户ID
     * @param status 售后状态
     * @param auditReason 审核原因
     * @return 是否处理成功
     */
    boolean handlerAfterSaleApply(Integer id, Integer userId, AfterSaleStatusEnum status, String auditReason);

    /**
     * 确认收货
     *
     * @param id 售后订单ID
     * @param userId 用户ID
     * @return 是否确认成功
     */
    boolean confirmReceive(Integer id, Integer userId);

    /**
     * 确认拒绝
     *
     * @param id 售后订单ID
     * @param userId 用户ID
     * @param auditReason 审核原因
     * @return 是否确认成功
     */
    boolean confirmRejection(Integer id, Integer userId, String auditReason);

    /**
     * 根据售后单号获取售后订单
     *
     * @param afterSaleSn 售后单号
     * @return 售后订单实体
     */
    TradeAfterSaleEntity getOneByAfterSaleSn(String afterSaleSn);

    /**
     * 更新售后订单状态
     *
     * @param id 售后订单ID
     * @param status 售后状态
     * @return 是否更新成功
     */
    boolean updateAfterSaleStatus(Integer id, Integer status);

    /**
     * 处理退款成功通知
     *
     * @param afterSaleSn 售后单号
     * @param afterSaleStatus 售后状态
     * @return 是否处理成功
     */
    boolean handleRefundSuccessNotify(String afterSaleSn, Integer afterSaleStatus);

    /**
     * 处理退款失败通知
     *
     * @param afterSaleSn 售后单号
     * @param afterSaleStatus 售后状态
     * @return 是否处理成功
     */
    boolean handleRefundFailNotify(String afterSaleSn, Integer afterSaleStatus);
    
    /**
     * 记录售后操作日志
     * 
     * @param afterSaleId 售后单ID
     * @param operationType 操作类型
     * @param description 操作描述
     */
    void logAfterSaleOperation(Integer afterSaleId, String operationType, String description);
}