package com.test.musichouduan.service;

import com.test.musichouduan.dto.MusicDTO;
import com.test.musichouduan.dto.MusicStatusDTO;
import com.test.musichouduan.dto.PageResult;
import com.test.musichouduan.entity.Music;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.concurrent.CompletableFuture;

/**
 * 音乐服务接口
 */
public interface MusicService {

    /**
     * 根据ID获取音乐，并根据用户ID判断是否收藏和点赞
     *
     * @param id 音乐ID
     * @param userId 用户ID (可以为null)
     * @return 音乐DTO
     */
    MusicDTO getMusicById(Long id, Long userId);

    /**
     * 根据ID获取音乐
     *
     * @param id 音乐ID
     * @return 音乐DTO
     */
    MusicDTO getMusicById(Long id);

    /**
     * 分页获取音乐列表
     *
     * @param page 页码
     * @param size 每页大小
     * @param keyword 关键字
     * @param typeId 类型ID
     * @return 分页结果
     */
    PageResult<MusicDTO> getMusicList(Integer page, Integer size, String keyword, Long typeId);

    /**
     * 根据歌手ID获取音乐列表
     *
     * @param singerId 歌手ID
     * @param page 页码
     * @param size 每页大小
     * @return 分页结果
     */
    PageResult<MusicDTO> getMusicListBySinger(Long singerId, Integer page, Integer size);

    /**
     * 获取最新音乐列表
     *
     * @param limit 限制数量
     * @return 音乐列表
     */
    List<MusicDTO> getLatestMusic(Integer limit);

    /**
     * 获取热门音乐列表
     *
     * @param limit 限制数量
     * @return 音乐列表
     */
    List<MusicDTO> getHotMusic(Integer limit);

    /**
     * 添加音乐
     *
     * @param musicDTO 音乐DTO
     * @param file 音乐文件
     * @param cover 封面文件
     * @return 音乐DTO
     */
    MusicDTO addMusic(MusicDTO musicDTO, MultipartFile file, MultipartFile cover);

    /**
     * 更新音乐
     *
     * @param id 音乐ID
     * @param musicDTO 音乐DTO
     * @param file 音乐文件
     * @param cover 封面文件
     * @param lyric 歌词文件
     * @return 音乐DTO
     */
    MusicDTO updateMusic(Long id, MusicDTO musicDTO, MultipartFile file, MultipartFile cover, MultipartFile lyric);

    /**
     * 删除音乐
     *
     * @param id 音乐ID
     * @return 是否成功
     */
    boolean deleteMusic(Long id);

    /**
     * 收藏/取消收藏音乐
     *
     * @param id 音乐ID
     * @param userId 用户ID
     * @return 是否收藏成功
     */
    boolean toggleCollectMusic(Long id, Long userId);

    /**
     * 获取用户收藏的音乐列表
     *
     * @param userId 用户ID
     * @param page 页码
     * @param size 每页大小
     * @return 分页结果
     */
    PageResult<MusicDTO> getCollectedMusic(Long userId, Integer page, Integer size);

    /**
     * 播放音乐
     *
     * @param id 音乐ID
     * @return 音乐DTO
     */
    MusicDTO playMusic(Long id);

    /**
     * 根据ID获取音乐实体
     *
     * @param id 音乐ID
     * @return 音乐实体
     */
    Music getById(Long id);

    /**
     * 定时任务接口，用于更新热门音乐缓存
     */
    void scheduleUpdateHotMusic();

    /**
     * 异步更新热门音乐缓存的接口
     * @return CompletableFuture 包装的音乐DTO列表
     */
    CompletableFuture<List<MusicDTO>> updateHotMusicCache();

    /**
     * 切换音乐点赞状态
     *
     * @param musicId 音乐ID
     * @param userId  用户ID
     * @return 是否点赞成功 (true: 点赞, false: 取消点赞)
     */
    boolean toggleLikeMusic(Long musicId, Long userId);

    /**
     * 获取音乐的收藏和点赞状态
     *
     * @param musicId 音乐ID
     * @param userId  用户ID
     * @return 音乐状态DTO
     */
    MusicStatusDTO getMusicStatus(Long musicId, Long userId);

    /**
     * 根据ID查找音乐实体
     *
     * @param musicId 音乐ID
     * @return 音乐实体
     */
    Music findMusicById(Integer musicId);
}
