package shop.alien.lawyer.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import shop.alien.entity.result.R;
import shop.alien.entity.store.vo.LawFirmListVO;
import shop.alien.entity.store.vo.LawFirmReconciliationVO;
import shop.alien.entity.store.vo.LawyerListVO;

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

/**
 * 律所对账结算服务类
 *
 * @author system
 * @since 2025-01-XX
 */
public interface LawFirmReconciliationService {


    /**
     * 获取律所对账总览
     *
     * @param firmId   律所ID（可选，不传则查询所有律所）
     * @param firmName 律所名称（可选，模糊查询）
     * @param startDate 开始日期（可选）
     * @param endDate   结束日期（可选）
     * @return 律所对账总览（包含总订单数量、总订单金额、总平台信息服务费）
     */
    R<LawFirmReconciliationVO> getLawFirmReconciliation(
            Integer firmId,
            String firmName,
            Date startDate,
            Date endDate
    );

    /**
     * 获取所有律所的对账统计列表（分页）
     *
     * @param firmName 律所名称（可选，模糊查询）
     * @param startDate 开始日期（可选）
     * @param endDate   结束日期（可选）
     * @param pageNum   页码
     * @param pageSize  页容
     * @return 律所对账统计列表（分页）
     */
    R<IPage<LawFirmListVO>> getAllLawFirmReconciliationList(
            String firmName,
            Date startDate,
            Date endDate,
            Integer pageNum,
            Integer pageSize
    );

    /**
     * 获取律所下所有律师的对账统计列表（分页）
     *
     * @param firmId   律所ID
     * @param startDate 开始日期（可选）
     * @param endDate   结束日期（可选）
     * @param pageNum   页码
     * @param pageSize  页容
     * @return 律师对账统计列表（分页）
     */
    R<IPage<LawyerListVO>> getLawyerReconciliationList(
            Integer firmId,
            Date startDate,
            Date endDate,
            Integer pageNum,
            Integer pageSize
    );

    /**
     * 获取律所下所有律师的对账统计列表（分页，支持律师名称模糊查询）
     *
     * @param firmId    律所ID
     * @param lawyerName 律师名称（可选，模糊查询）
     * @param startDate 开始日期（可选）
     * @param endDate   结束日期（可选）
     * @param pageNum   页码
     * @param pageSize  页容
     * @return 律师对账统计列表（分页）
     */
    R<IPage<LawyerListVO>> getLawyerReconciliationListWithName(
            Integer firmId,
            String lawyerName,
            Date startDate,
            Date endDate,
            Integer pageNum,
            Integer pageSize
    );

    /**
     * 获取律师的已完成订单列表（分页）
     *
     * @param lawyerId 律师ID
     * @param pageNum   页码
     * @param pageSize  页容
     * @return 律师订单列表（分页）
     */
    R<IPage<LawFirmReconciliationVO>> getLawyerOrderList(
            Integer lawyerId,
            Integer pageNum,
            Integer pageSize
    );

    /**
     * 导出所有律所的对账统计列表到Excel
     *
     * @param response  HTTP响应对象
     * @param firmName  律所名称（可选，模糊查询）
     * @param startDate 开始日期（可选）
     * @param endDate   结束日期（可选）
     * @param pageNum   页码（可选，不传或传0则导出全部，传值则导出本页）
     * @param pageSize  页容（可选，与pageNum配合使用）
     * @throws Exception 导出过程中的异常
     */
    void exportAllLawFirmList(
            HttpServletResponse response,
            String firmName,
            Date startDate,
            Date endDate,
            Integer pageNum,
            Integer pageSize
    ) throws Exception;

    /**
     * 导出律师对账统计列表到Excel
     *
     * @param response   HTTP响应对象
     * @param firmId     律所ID
     * @param lawyerName 律师名称（可选，模糊查询）
     * @param startDate  开始日期（可选）
     * @param endDate    结束日期（可选）
     * @param pageNum    页码（可选，不传或传0则导出全部，传值则导出本页）
     * @param pageSize   页容（可选，与pageNum配合使用）
     * @throws Exception 导出过程中的异常
     */
    void exportLawyerListWithName(
            HttpServletResponse response,
            Integer firmId,
            String lawyerName,
            Date startDate,
            Date endDate,
            Integer pageNum,
            Integer pageSize
    ) throws Exception;
}

