package shop.alien.lawyer.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import shop.alien.entity.result.R;
import shop.alien.entity.store.LawyerUser;
import shop.alien.entity.store.dto.LawyerUserDto;
import shop.alien.entity.store.vo.LawyerUserVo;

import javax.servlet.http.HttpServletResponse;
import java.util.Map;

/**
 * 律师用户 服务类
 *
 * @author system
 * @since 2025-01-XX
 */
public interface LawyerUserService extends IService<LawyerUser> {

    /**
     * 分页查询律师用户列表
     *
     * @param pageNum  页码
     * @param pageSize 页容
     * @param name     姓名
     * @param phone    手机号
     * @param status   状态
     * @return IPage<LawyerUser>
     */
    R<IPage<LawyerUser>> getLawyerUserList(int pageNum, int pageSize, String name, String phone, Integer status);

    /**
     * 新增律师用户
     *
     * @param lawyerUser 律师用户
     * @return R<LawyerUser>
     */
    R<LawyerUser> addLawyerUser(LawyerUser lawyerUser);

    /**
     * 编辑律师用户
     *
     * @param lawyerUser 律师用户
     * @return R<LawyerUser>
     */
    R<LawyerUser> editLawyerUser(LawyerUser lawyerUser);

    /**
     * 删除律师用户
     *
     * @param id 主键
     * @return R<Boolean>
     */
    R<Boolean> deleteLawyerUser(Integer id);

    /**
     * 获取律师详情
     *
     * @param lawyerId 律师ID
     * @return R<Map < String, Object>>
     */
    R<Map<String, Object>> getLawyerDetail(Integer lawyerId);

    /**
     * 获取律师在线状态
     *
     * @param lawyerIds 律师ID数组（逗号分隔）
     * @return R<Map < Integer, Boolean>>
     */
    R<Map<Integer, Boolean>> getLawyerOnlineStatus(String lawyerIds);

    /**
     * 获取推荐律师列表
     *
     * @param page       页码
     * @param pageSize   每页数量
     * @param categoryId 分类ID（可选）
     * @param lawyerId   律师ID（可选）
     * @return R<IPage < LawyerUser>>
     */
    R<IPage<LawyerUser>> getRecommendedLawyerList(int page, int pageSize, Integer categoryId, Integer lawyerId);

    /**
     * 根据会话获取推荐律师列表
     *
     * @param sessionId 会话ID
     * @param messageId 消息ID（可选）
     * @return R<IPage < LawyerUser>>
     */
    R<IPage<LawyerUser>> getRecommendedLawyersBySession(String sessionId, Integer messageId);

    /**
     * 通过姓名模糊查询律师（并保存搜索历史）
     *
     * @param nickName     律师姓名（支持模糊查询）
     * @param page         页码
     * @param pageSize     每页数量
     * @param clientUserId 客户端用户ID（可选，用于保存搜索历史）
     * @return R<IPage < LawyerUser>>
     */
    R<IPage<LawyerUser>> searchLawyerByName(String nickName, int page, int pageSize, Integer clientUserId);

    /**
     * 获取推荐律师列表
     *
     * @param page       页码
     * @param size       每页数量
     * @param categoryId 分类ID（可选）
     * @return R<IPage < LawyerUser>>
     */
    R<IPage<LawyerUser>> getAiRecommendList(int page, int size, Integer categoryId);

    /**
     * 注销律师用户
     * <p>
     * 注销前会进行以下校验：
     * 1. 参数校验：律师ID不能为空
     * 2. 律师存在性校验：律师必须存在
     * 3. 注销状态校验：已注销的律师不允许重复注销
     * 4. 设置注销相关字段：注销标记、注销时间、状态等
     * </p>
     *
     * @param id 律师ID
     * @return R<Map < String, Object>> 注销结果，包含律师ID、姓名、手机号、注销标记、注销时间等信息
     */
    R<Map<String, Object>> logOutLawyerUser(Integer id);

    /**
     * 获取律师信息
     *
     * @param lawyerId 律师ID
     * @return R<LawyerUser> 律师信息
     */
    R<LawyerUserVo> getLawyerInfo(Integer lawyerId);

    /**
     * 更新律师用户信息
     *
     * @param lawyerUserVo 律师用户信息VO
     * @return R<LawyerUser> 更新后的律师信息
     */
    R<LawyerUserVo> updateLawyerUser(LawyerUserVo lawyerUserVo);

    /**
     * 通过手机号查询律师信息
     *
     * @param phone 手机号
     * @return R<LawyerUser> 律师信息
     */
    R<LawyerUser> getLawyerInfoByPhone(String phone);

    /**
     * 获取中台律师列表
     *
     * @return R<LawyerUser> 律师信息
     */
    R<IPage<LawyerUserVo>> getLawyerList(String name,
                                         String phone,
                                         Integer firmId,
                                         String startTime,
                                         String endTime,
                                         int page,
                                         int pageSize);

    /**
     * 设置律师推荐状态
     *
     * @param lawyerId 律师ID
     * @param isRecommended 推荐状态，0:取消推荐，1:推荐
     * @return R<Boolean> 操作结果
     */
    R<Boolean> isRecommended(Integer lawyerId, Integer isRecommended);

    /**
     * 导出中台律师列表
     *
     * @param response HttpServletResponse对象
     * @param name 姓名（支持模糊查询）
     * @param phone 手机号（支持模糊查询）
     * @param firmId 律所ID
     * @param startTime 开始日期
     * @param endTime 结束日期
     * @param pageNum 页码（可选，不传或传0则导出全部）
     * @param pageSize 页容（可选，与pageNum配合使用）
     * @throws Exception 导出异常
     */
    void exportLawyerList(HttpServletResponse response,
                          String name,
                          String phone,
                          Integer firmId,
                          String startTime,
                          String endTime,
                          Integer pageNum,
                          Integer pageSize) throws Exception;

    R<LawyerUserVo> updateLawyerUserCharge(LawyerUserDto lawyerUserDto);
}

