package com.yonge.cooleshow.biz.dal.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yonge.cooleshow.biz.dal.dto.search.*;
import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
import com.yonge.cooleshow.biz.dal.vo.*;
import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * MusicSheetDao数据库访问类
 *
 * @author yzp
 * @version v1.0
 * @date 2022-03-25 23:46:28
 **/
public interface MusicSheetDao extends BaseMapper<MusicSheet> {
    /**
     * 分页查询
     *
     * @return com.yonge.cooleshow.biz.dal.vo.MusicSheetVo
     */
    List<MusicSheetVo> selectPage(@Param("page") IPage<MusicSheetVo> page, @Param("param") MusicSheetSearch query);

    /**
     * 分页查询专辑详情里的曲目
     *
     * @param page  分页
     * @param query 查询条件
     * @return
     */
    List<MusicSheetVo> selectAlbumDetailPage(@Param("page") IPage<MusicSheetVo> page, @Param("param") MusicAlbumDetailSearch query);

    /**
     * 获取曲目详情
     *
     * @param id 曲目id
     * @return 曲目信息
     */
    MusicSheetDetailVo detail(Long id);

    /**
     * 分页查询
     */
    List<MusicSheetVo> selectStudentMusicPage(@Param("page") IPage<MusicSheetVo> page, @Param("param") StudentMusicSheetSearch query, @Param("clientType") ClientEnum clientType);

    /**
     * 我的单曲
     *
     * @param page  分页信息
     * @param query 查询条件
     * @return list
     */
    List<MusicSheetVo> selectMyMusicPage(@Param("page") IPage<MusicSheetVo> page, @Param(
            "param") StudentMusicSheetSearch query);

    /**
     * 收藏单曲
     *
     * @param page  分页信息
     * @param query 查询条件
     * @param clientType ClientEnum
     * @return list
     */
    List<MusicSheetVo> selectFavoriteMusicPage(@Param("page") IPage<MusicSheetVo> page, @Param("param") StudentMusicSheetSearch query, @Param("clientType") ClientEnum clientType);

    /**
     * 最近练习曲目
     *
     * @param query               查询条件
     * @param practiceMusicIdList 最近练习曲目id
     * @return list
     */
    List<MusicSheetVo> selectPracticeMusicPage(@Param("param") StudentMusicSheetSearch query, @Param(
            "practiceMusicIdList") List<Long> practiceMusicIdList);

    /**
     * 学生曲目购买信息
     *
     * @param page  分页
     * @param query 查询条件
     * @return list
     */
    List<StudentMusicSheetOrderVo> selectStudentOrderPage(@Param("page") IPage<StudentMusicSheetOrderVo> page, @Param(
            "param") StudentMusicSheetOrderSearch query);

    /**
     * 老师曲目信息
     *
     * @param page  分页
     * @param query 查询条件
     * @return list
     */
    List<TeacherMusicSheetVo> selectTeacherPage(@Param("page") IPage<TeacherMusicSheetVo> page, @Param(
            "param") TeacherMusicSheetSearch query);

    /**
     * 审核中心-乐谱审核
     *
     * @param page  分页
     * @param query 查询条件
     * @return list
     */
    List<TeacherMusicSheetVo> selectAuditPage(@Param("page") IPage<TeacherMusicSheetVo> page, @Param(
            "param") TeacherMusicSheetAuditSearch query);

    /**
     * 获取老师过审的曲目数量
     *
     * @param userId 老师id
     * @return
     */
    Integer selectTeacherMusicSheetCount(@Param("userId") Long userId);

    /**
     * 点播数量统计
     *
     * @return
     */
    HomeMusicSheetVo selectMusicNum();

    /**
     * 查询付费人数最多的前5个曲目
     *
     * @return
     */
    List<HomeMusicSheetVo.MusicSheetSmall> selectPayMusicSheet();

    /**
     * 查询老师曲目审核数量
     *
     * @param userId 老师id
     * @return
     */
    TeacherAuditMusicSheetVo selectTeacherCount(@Param("userId") Long userId);

    /**
     * 老师统计
     *
     * @param userId
     * @return
     */
    List<TeacherTotalVo> queryTeacherTotal(@Param("userId") Long userId);

    /**
     * 学生统计
     *
     * @param userId
     * @return
     */
    List<StudentTotalVo> queryStudentTotal(@Param("userId") Long userId);

    /**
     * 审核历史记录
     *
     * @param originalMusicSheetId 原曲目id
     * @param authMusicSheetId     最新的审核曲目id
     * @return
     */
    List<MusicSheetDetailVo> auditDetailList(@Param("originalMusicSheetId") Long originalMusicSheetId, @Param(
            "authMusicSheetId") Long authMusicSheetId);

    /**
     * 单曲数量统计
     * @param musicIds 单曲ID
     * @return List<StatGroupWrapper>
     */
    List<StatGroupWrapper> selectMusicAlbumStatInfo(@Param("musicIds") List<Long> musicIds);
}