package cn.iocoder.yudao.module.course.service;

import cn.iocoder.yudao.module.course.entity.SchoolCourseOrder;
import cn.iocoder.yudao.module.course.vo.*;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.apache.ibatis.annotations.Param;

import javax.validation.Valid;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 驾照报名订单 Service 接口
 *
 * @author 若依
 */
public interface SchoolCourseOrderService extends IService<SchoolCourseOrder> {

    /**
     * 创建驾照报名订单
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    String createSchoolCourseOrder(@Valid SchoolCourseOrderVO createReqVO);

    /**
     * 更新驾照报名订单
     *
     * @param updateReqVO 更新信息
     */
    void updateSchoolCourseOrder(@Valid SchoolCourseOrderVO updateReqVO);

    /**
     * 删除驾照报名订单
     *
     * @param id 编号
     */
    void deleteSchoolCourseOrder(String id);

    /**
     * 获得驾照报名订单
     *
     * @param id 编号
     * @return 驾照报名订单
     */
    SchoolCourseOrder getSchoolCourseOrder(String id);


    /**
     * 获得驾照报名订单分页
     *
     * @param page      分页参数
     * @param pageReqVO SchoolCourseOrderVO
     * @return com.baomidou.mybatisplus.core.metadata.IPage<cn.iocoder.yudao.module.course.vo.SchoolCommissionVO>
     * @author PQZ
     * @date 10:10 2025/2/25
     **/
    IPage<SchoolCourseOrderVO> queryPage(Page<SchoolCommissionVO> page, SchoolCourseOrderVO pageReqVO);
    IPage<SchoolCourseOrderVO> queryPageNew(Page<SchoolCommissionVO> page, SchoolCourseOrderVO pageReqVO);

    /**
     * 终止订单
     *
     * @param orderNo   订单号
     * @param endReason 终止原因
     * @param endTime   终止时间
     */
    void endOrder(String orderNo, String endReason, LocalDateTime endTime);

    /**
     * 快速创建订单
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    String fastCreateSchoolCourseOrder(SchoolCourseOrderVO createReqVO);

    /**
     * 根据用户id获取订单信息
     *
     * @param loginUserId 用户id
     * @return List<SchoolCourseOrderVO>
     */
    List<SchoolCourseOrderVO> getCourseByLoginUser(Long loginUserId);
    /**
     * 查询学员代报名且没有确认的订单
     * @param loginUserId
     * @return
     */
    List<SchoolCourseOrderVO> getCourseIfProxyOrders(Long loginUserId);
    List<SchoolCourseOrderVO> getCourseByInfo(Long userId, String courseId);

    /**
     * 报名之后发送对应消息
     */
    Boolean sendOrderMessage(String studentName, String courseName, Long coachId);

    /**
     * 教练修改学员毕业时间
     */
    void updateStudentGradTime(String studentId, String gradTime);

    /**
     * 教练修改学员拿证时间
     */
    void updateStudentPassTime(String studentId, String gradTime);

    Long businessManagerCreateSchoolCourseOrder(SchoolCourseOrderBusinessVO createReqVO);
    /**
     * 代报名用户确认订单之后，更新订单状态
     */
    boolean updateOrderifAgree(List<String> orderIds);

    /**
     * 根据学员id获取订单提成方案
     */
    String getSchemeByStudentId(Long studentId, String courseId, Integer subject);

    /**
     * 查询是否有订单使用该提成方案
     */
    Integer getOrderCountBySchemeId(String schemeId);

    /**
     * 根据教练id获取对应招生
     */
    IPage<SchoolCourseOrderVO> getOrderByCoachId(SchoolCourseOrderVO pageReqVO, Page<SchoolCourseOrderVO> page);

    /**
     * 获取教练的订单总金额
     * @param pageReqVO
     * @return
     */
    List<SchoolCourseOrderVO> getCoachMoney(SchoolCourseOrderVO pageReqVO);
    /**
     * 获取教练的订单明细
     * @param pageReqVO
     * @return
     */
    IPage<SchoolCourseOrderVO> getOrderMoneyByCoachId(SchoolCourseOrderVO pageReqVO, Page<SchoolCourseOrderVO> page);


    /**
     * 获取导出数据
     * @param exportVO
     * @param page
     * @return
     */
    IPage<CourseOrderExportVO> getOrderExportData(CourseOrderExportVO exportVO, Page<CourseOrderExportVO> page);
    CourseOrderStatisticsVO getOrderStatistics(CourseOrderExportVO exportVO);

    /**
     * 导出的三种形式
     * @param exportVO
     * @return
     */
    List<CourseOrderExportVO> getOrderList(CourseOrderExportVO exportVO);
    List<CourseOrderExportVO> getAllOrderList(CourseOrderExportVO exportVO);
    List<CourseOrderExportVO> getOrderListByRange(CourseOrderExportVO exportVO);

    /**
     * 首页财务详细列表
     */
    List<FinanceInfoOnCoachAndStudent> getMoneyInfoOnFinance(FinanceInfoOnCoachAndStudent entity);

    IPage<FinanceInfoOnCoachAndStudent> getFinanceStudentByCoachId(FinanceInfoOnCoachAndStudent entity, Page<FinanceInfoOnCoachAndStudent> page);

}
