package shop.alien.store.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.vo.LawyerUserLogoutListVo;
import shop.alien.entity.store.vo.LawyerUserVo;

import javax.servlet.http.HttpServletResponse;
import java.util.List;
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（可选）
     * @return R<IPage<LawyerUser>>
     */
    R<IPage<LawyerUser>> getRecommendedLawyerList(int page, int pageSize, Integer categoryId);

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

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

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

    /**
     * 导出中台律师列表
     *
     * @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,
                          String practiceStartDate,
                          Integer firmId,
                          String startTime,
                          String endTime,
                          Integer pageNum,
                          Integer pageSize) throws Exception;

    /**
     * 中台-律师注销列表（lawyer_user）
     *
     * @param name 律师姓名（lawyer_user.name 模糊）
     */
    IPage<LawyerUserLogoutListVo> getLawyerUserLogoutPage(int pageNum, int pageSize, String name, String phone, Integer logoutFlag);
}

