package com.ghy.order.service;

import com.ghy.common.core.domain.AjaxResult;
import com.ghy.order.domain.AfterServiceRecord;

import java.util.List;

/**
 * 售后记录Service接口
 *
 * @author clunt
 * @date 2022-09-25
 */
public interface IAfterServiceRecordService {
    /**
     * 查询售后记录
     *
     * @param id 售后记录主键
     * @return 售后记录
     */
    AfterServiceRecord selectAfterServiceRecordById(String id);

    /**
     * 查询售后记录列表
     *
     * @param afterServiceRecord 售后记录
     * @return 售后记录集合
     */
    List<AfterServiceRecord> selectAfterServiceRecordList(AfterServiceRecord afterServiceRecord);

    /**
     * 新增售后记录
     *
     * @param afterServiceRecord 售后记录
     * @return 结果
     */
    int insertAfterServiceRecord(AfterServiceRecord afterServiceRecord);

    /**
     * 修改售后记录
     *
     * @param afterServiceRecord 售后记录
     * @return 结果
     */
    AjaxResult updateAfterServiceRecord(AfterServiceRecord afterServiceRecord) throws Exception;

    public AfterServiceRecord getUnfinishedByOrderDetailId(Long orderDetailId);

    /**
     * 批量删除售后记录
     *
     * @param ids 需要删除的售后记录主键集合
     * @return 结果
     */
    int deleteAfterServiceRecordByIds(String ids);

    /**
     * 删除售后记录信息
     *
     * @param id 售后记录主键
     * @return 结果
     */
    int deleteAfterServiceRecordById(String id);

    /**
     * 查询师傅反馈超时的售后记录
     * 倒计时1：客户发起后，师傅24小时不操作任何反馈
     *
     * @return 超时的售后记录列表
     */
    List<AfterServiceRecord> selectWorkerFeedbackTimeoutRecords();

    /**
     * 查询客户确认超时的售后记录
     * 倒计时2：师傅重做完成后客户36小时不操作
     * 倒计时3：师傅拒绝后客户36小时不操作
     *
     * @return 超时的售后记录列表
     */
    List<AfterServiceRecord> selectCustomerConfirmTimeoutRecords();

    /**
     * 执行退款逻辑
     * 用于定时器自动处理退款
     *
     * @param afterServiceRecord 售后记录
     */
    void executeRefundLogic(AfterServiceRecord afterServiceRecord);

    /**
     * 恢复确认中倒计时
     * @param orderDetailId 子单ID
     */
    void resumeConfirmTimeout(Long orderDetailId);

    /**
     * 修改商品售后记录
     *
     * @param afterServiceRecord 售后记录
     * @return 结果
     */
    AjaxResult updateGoodsAfterServiceRecord(AfterServiceRecord afterServiceRecord) throws Exception;

    /**
     * 师傅重发/补发操作
     * 师傅端点击重发补发按钮，保存重发/补发方案
     *
     * @param afterServiceRecord 售后记录
     * @return 操作结果
     */
    AjaxResult workerResendPlan(AfterServiceRecord afterServiceRecord);

    /**
     * 退货操作
     * 客户或师傅端进行退货操作，保存退货信息
     *
     * @param afterServiceRecord 售后记录
     * @return 操作结果
     */
    AjaxResult returnGoods(AfterServiceRecord afterServiceRecord);

    AfterServiceRecord unfinished(Long id);

    /**
     * 查询师傅重发补发超时的售后记录
     * 快递/物流：6天倒计时
     * 非快递：24小时倒计时
     * @return 超时的售后记录列表
     */
    List<AfterServiceRecord> selectWorkerResendTimeoutRecords();

    /**
     * 查询退货发货时间超过6天且师傅未确认收货的售后记录
     * 用于定时任务自动处理师傅确认收货超时的情况
     * 
     * @return 超时的售后记录列表
     */
    List<AfterServiceRecord> selectReturnShipTimeoutRecords();

    /**
     * 师傅确认收货
     * 师傅确认收到货物后，根据同意处理方式决定是否执行退款
     *
     * @param afterServiceRecord 售后记录
     * @return 操作结果
     */
    AjaxResult workerConfirmReceive(AfterServiceRecord afterServiceRecord);

    /**
     * 恢复财务金额
     * 当售后取消时，将之前扣减的金额恢复到原财务账单
     * @param afterServiceRecord 售后记录
     */
    void restoreFinancialAmount(AfterServiceRecord afterServiceRecord);
}
