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

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.dao.MusicSheetDao;
import com.yonge.cooleshow.biz.dal.dto.MusicImgDto;
import com.yonge.cooleshow.biz.dal.dto.ReasonDto;
import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
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.enums.OrderTypeEnum;
import com.yonge.cooleshow.biz.dal.vo.*;
import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
import com.yonge.cooleshow.biz.dal.wrapper.music.MusicCompareWrapper;
import com.yonge.cooleshow.common.entity.HttpResponseResult;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

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

    MusicSheetDao getDao();


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

    IPage<MusicSheetVo> selectCbsPage(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);

    MusicSheetDetailVo getAuditDetail(Long id);

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


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

    /**
     * 学生端 曲目分页查询
     *
     * @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);

//    void auditSyncCbs(Long cbsMusicSheetId);

    /**
     * 假删除曲目
     *
     * @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 订单信息
     * @param actualPrice       付款价格
     * @param serviceFeeAmount  服务费
     */
    void addMusicSheetPurchaseRecord(UserOrderDetailVo userOrderDetailVo, BigDecimal actualPrice, BigDecimal serviceFeeAmount);

    /**
     * 订单生产后，创建记录
     *
     * @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(MusicImgDto musicImgDto, Long musicSheetId);

    /**
     * 曲目修复
     * @param musicImgDto MusicImgDto
     * @param musicSheetId 曲目Id
     * @return Boolean
     */
    Boolean updateMusicCorrect(MusicImgDto musicImgDto, Long musicSheetId);


    void initMusicSheetDetailVo(List<MusicSheetDetailVo> sheetDetailVos);

    /**
     * 添加上架曲目的虚拟数
     */
    void setVirtualNumber();

    /**
     * 购买曲目专辑
     *
     * @param orderGoodsInfo
     * @return
     */
    void buyMusicSheetCheck(UserPaymentOrderWrapper.OrderGoodsInfo orderGoodsInfo);


    /**
     * 购买曲目专辑
     *
     */
    void orderAfterSheet(UserPaymentOrderWrapper.OrderGoodsInfo orderGoodsInfo);

    List<MusicSheetUploadCountVo> countByUser(List<Long> userIds);

    /**
     * 获取曲目信息
     *
     * @param bizIds 曲目id
     */
    Map<Long,MusicSheet> getMapByIds(List<Long> bizIds);

    MusicCompareWrapper.SearchData search(MusicCompareWrapper.MusicSearch queryInfo);

    /**
     * 机构曲目搜索
     *
     */
    MusicCompareWrapper.SearchData searchTenant(MusicCompareWrapper.MusicSearch queryInfo);

    MusicSheet initMusicSheet(String musicSheetJson);

}