package shop.alien.lawyer.service;

import com.baomidou.mybatisplus.extension.service.IService;
import shop.alien.entity.result.R;
import shop.alien.entity.store.LawyerConsultationOrder;
import shop.alien.entity.store.vo.LawyerConsultationOrderVO;

import java.util.Map;

/**
 * 咨询订单 服务类
 *
 * @author system
 * @since 2025-01-XX
 */
public interface LawyerClientConsultationOrderService extends IService<LawyerConsultationOrder> {

    /**
     * 删除咨询订单
     *
     * @param id 主键
     * @return R<Boolean>
     */
    R<Boolean> deleteConsultationOrder(Integer id);


    /**
     * 获取咨询订单详情
     *
     * @param lawyerOrderId 订单ID
     * @return 咨询订单详情VO
     */
    LawyerConsultationOrderVO getConsultationOrderDetail(String lawyerOrderId);

    /**
     * 查询咨询订单（律师端）
     *
     * @param pageNum      页码
     * @param pageSize     页容
     * @param startDate  开始时间
     * @param endDate 结束时间
     * @param lawyerId 律师ID
     * @return IPage<LawyerConsultationOrderVO>
     */
    Map<String, Object> getLawyerConsultationOrderInfo(int pageNum, int pageSize, String startDate, String endDate, String clientUserName, String orderStatus, String lawyerId);

    /**
     * 律师确认订单
     * <p>
     * 支持两种操作类型：
     * 1. 接单：将订单状态从待接单更新为进行中
     * 2. 取消：将订单状态更新为已取消
     * </p>
     *
     * @param id        订单ID
     * @param actionType 操作类型：1-接单，2-取消
     * @return R<Boolean> 是否成功
     */
    R<Boolean> confirmOrder(String id, String actionType);


    /**
     * 订单开始计时（律师端）
     * <p>
     * 订单开始计时：
     * 1. 当订单为按时收费，订单状态为进行中时，订单开始计时
     * </p>
     *
     * @param id        订单ID
     * @return R<Boolean> 是否成功
     */
    R<Boolean> orderStartTiming(String id);

    /**
     * 申请退款
     *
     * @param id 订单ID
     * @param refundReason 退款原因
     * @return R<Boolean> 是否成功
     */
    R<Boolean> requestRefund(Integer id, String refundReason);


    /**
     * 退款申请处理
     *
     * @param lawyerConsultationOrder 订单对象
     * @return R<Boolean> 是否成功
     */
    R<Boolean> refundApplyProcess(LawyerConsultationOrder lawyerConsultationOrder);

    /**
     * 检查订单接单后是否有消息记录
     * <p>
     * 根据订单ID查询订单信息，获取律师接单时间、用户ID和律师ID，
     * 然后查询 life_message 表，检查是否存在律师发送给用户的消息记录，
     * 且消息创建时间大于接单时间。
     * </p>
     *
     * @param id 订单ID，不能为空
     * @return true表示有消息记录，false表示无消息记录
     * @throws IllegalArgumentException 当订单ID无效时抛出
     * @throws RuntimeException        当查询异常时抛出
     * @author system
     * @since 2025-01-XX
     */
    Boolean checkMessageAfterAccept(String id);
}

