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

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yonge.cooleshow.auth.api.entity.SysUser;
import com.yonge.cooleshow.auth.api.enums.SysUserType;
import com.yonge.cooleshow.biz.dal.dto.MusicSheetDto;
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.*;
import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yonge.cooleshow.biz.dal.vo.*;
import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
import com.yonge.cooleshow.common.entity.HttpResponseResult;

/**
 * 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);

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

    /**
     * 获取专辑详情曲目信息
     *
     * @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, SysUserType userType);

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

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

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


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

    /**
     * 最近练习曲目
     *
     * @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
     */
    boolean sendBuyMessage(Long teacherId, Long studentId, Long musicSheetId);

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

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