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

import java.util.List;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yonge.cooleshow.auth.api.entity.SysUser;
import com.yonge.cooleshow.biz.dal.dto.MusicSheetDto;
import com.yonge.cooleshow.biz.dal.dto.MusicSheetExport;
import com.yonge.cooleshow.biz.dal.dto.ReasonDto;
import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
import com.yonge.cooleshow.biz.dal.dto.req.TeacherMusicSheetAuditReq;
import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumDetailSearch;
import com.yonge.cooleshow.biz.dal.dto.search.MusicSheetSearch;
import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetOrderSearch;
import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetSearch;
import com.yonge.cooleshow.biz.dal.dto.search.TeacherMusicSheetAuditSearch;
import com.yonge.cooleshow.biz.dal.dto.search.TeacherMusicSheetSearch;
import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
import com.yonge.cooleshow.biz.dal.vo.HomeMusicSheetVo;
import com.yonge.cooleshow.biz.dal.vo.MusicSheetDetailVo;
import com.yonge.cooleshow.biz.dal.vo.MusicSheetShareVo;
import com.yonge.cooleshow.biz.dal.vo.MusicSheetVo;
import com.yonge.cooleshow.biz.dal.vo.MusicSheetWebsiteDetailVo;
import com.yonge.cooleshow.biz.dal.vo.ShareProfitVo;
import com.yonge.cooleshow.biz.dal.vo.StudentMusicSheetOrderVo;
import com.yonge.cooleshow.biz.dal.vo.StudentTotalVo;
import com.yonge.cooleshow.biz.dal.vo.TeacherAuditMusicSheetVo;
import com.yonge.cooleshow.biz.dal.vo.TeacherMusicSheetVo;
import com.yonge.cooleshow.biz.dal.vo.TeacherTotalVo;
import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
import com.yonge.cooleshow.common.entity.HttpResponseResult;
import com.yonge.toolset.utils.easyexcel.ExcelDataReaderProperty;

/**
 * MusicSheetService服务类
 * @author yzp
 * @date 2022-03-25 23:46:28
 * @version v1.0
 **/
public interface MusicSheetService extends IService<MusicSheet> {


    /**
     * 曲目分页查询
     *
     * @param page 分页
     * @param query 查询条件
     * @return iPage 分页信息
     */
    IPage<MusicSheetVo> selectPage(IPage<MusicSheetVo> page, MusicSheetSearch query);
    
    IPage<MusicSheetVo> queryRelatedList(IPage<MusicSheetVo> page, Long albumId, Long musicSheetId);

    /**
     * 曲目状态修改 启用、停用
     *
     * @param id 曲目id
     * @param reason
     * @param client
     * @return boolean
     */
    boolean state(Long id, String reason, ClientEnum client);

    /**
     * 获取专辑详情曲目信息
     *
     * @param page 分页信息
     * @param query 查询条件
     * @return MusicSheet
     */
    IPage<MusicSheetVo> selectAlbumDetailPage(IPage<MusicSheetVo> page, MusicAlbumDetailSearch query);

    /**
     * 老师分享乐谱信息
     *
     * @param sysUser 老师登录信息
     * @return 分享信息
     */
    MusicSheetShareVo shareMusicSheet(SysUser sysUser);

    /**
     * 查询详情
     *
     * @param id 曲谱id
     * @param sysUser 登录用户
     * @return 曲谱信息
     */
    MusicSheetDetailVo detail(Long id, SysUser sysUser, ClientEnum userType);

    /**
     * 学生端 曲目分页查询
     *
     * @param page 分页
     * @param query 查询条件
     * @param clientType ClientEnum
     * @return iPage 分页信息
     */
    IPage<MusicSheetVo> selectStudentPage(IPage<MusicSheetVo> page, StudentMusicSheetSearch query, ClientEnum clientType);

    /**
     * 更新曲目专辑数
     * @param records List<MusicSheetVo>
     * @return List<MusicSheetVo>
     */
    List<MusicSheetVo> updateMusicAlbumNumInfo(List<MusicSheetVo> records);

    /**
     * 收藏/取消收藏 曲目
     *
     * @param userId 用户id ， 学生id
     * @param musicSheetId 曲目id
     * @param clientType 客户端类型
     * @return boolean
     */
    boolean setFavorite(Long userId, Long musicSheetId, ClientEnum clientType);

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


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

    /**
     * 最近练习曲目
     *
     * @param page 分页信息
     * @param query 查询条件
     * @return page
     */
    IPage<MusicSheetVo> practiceMusic(IPage<MusicSheetVo> page, StudentMusicSheetSearch query);

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

    /**
     * 老师详情 乐谱 展示
     *
     * @param page 分页
     * @param query 查询条件
     * @return page
     */
    IPage<TeacherMusicSheetVo> selectTeacherPage(IPage<TeacherMusicSheetVo> page, TeacherMusicSheetSearch query);

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

    /**
     * 审核曲目
     *
     * @param param 审核信息
     * @param userId 审核员id
     * @return boolean
     */
    boolean audit(TeacherMusicSheetAuditReq param, Long userId);

    /**
     * 假删除曲目
     *
     * @param id 曲目id
     * @return boolean
     */
    boolean del(Long id);

    /**
     *  展示已过审的乐谱数量
     *
     * @param sysUser 老师信息
     * @return
     */
    Integer countTeacherMusicSheet(SysUser sysUser);
    /**
     * 保存曲目信息
     *
     * @param musicSheetDto
     * @return
     */
    boolean saveMusicSheet(MusicSheetDto musicSheetDto,Long userId);

    /**
     * 曲目购买前的验证
     *
     * @param orderReqInfo 购买信息
     * @return
     */
    HttpResponseResult<OrderCreateRes> buyMusicSheetCheck(OrderReq.OrderReqInfo orderReqInfo);

    /**
     * 曲目购买成功后的记录数据
     *
     * @param userOrderDetailVo
     */
    void buyMusicSheetSuccess(UserOrderDetailVo userOrderDetailVo);

    /**
     * 发送学生购买曲目消息
     * @param teacherId 老师id
     * @param studentId 学生id
     * @param musicSheetId 曲目id
     * @param orderClient
     * @param orderType
     */
    boolean sendBuyMessage(Long teacherId, Long studentId, Long musicSheetId, ClientEnum orderClient, OrderTypeEnum orderType);

    /**
     * 订单生产后，创建记录
     *
     * @param userOrderDetailVo
     */
    void orderAfterSheet(UserOrderDetailVo userOrderDetailVo);

    /**
     *  订单取消
     *
     * @param userOrderDetailVo
     */
    void buyMusicSheetCancel(UserOrderDetailVo userOrderDetailVo);

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

    /**
     * 获取首页统计数据
     *
     * @return
     */
    HomeMusicSheetVo getMusicSheetHome();

    /**
     * 导入曲目
     *
     * @param dataList 导入信息
     * @param userId 导入人id
     */
    void importExcel(List<ExcelDataReaderProperty<MusicSheetExport>> dataList, Long userId);

    /**
     * 官网曲目详情
     *
     * @param musicSheetId 曲目id
     * @param sysUser SysUser
     * @param clientType 客户端类型
     * @return
     */
    MusicSheetWebsiteDetailVo websiteDetail(Long musicSheetId, SysUser sysUser, ClientEnum clientType);

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

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

    /***
     * 学生统计
     * @author liweifan
     * @param: userId
     */
    List<StudentTotalVo> queryStudentTotal(Long userId);

    /**
     * 老师乐谱分享分润
     *
     * @param sysUser 分享人
     * @param musicSheetId 曲目id
     */
    ShareProfitVo shareMusicSheetProfit(SysUser sysUser, Long musicSheetId);

    /**
     * 置顶曲目
     *
     * @param musicSheetId 曲目id
     * @return
     */
    Boolean top(Long musicSheetId);

    /**
     * 批量启用/停用
     *
     * @param reasonDto
     * @return
     */
    Boolean stateList(ReasonDto reasonDto);

    /**
     * 渲染图
     *
     * @param musicImg
     * @param musicSheetId
     * @return
     */
    Boolean updateMusicImg(String musicImg, Long musicSheetId);

    /**
     *
     * @param authMusicSheetId 曲目审核id
     */
    MusicSheetDetailVo auditDetail(Long authMusicSheetId);

    /**
     *
     * 审核历史记录
     *
     * @param authMusicSheetId 曲目审核id
     * @return
     */
    List<MusicSheetDetailVo> auditDetailList(Long authMusicSheetId);
}