package com.test.musichouduan.service;

import com.test.musichouduan.dto.PageResult;
import com.test.musichouduan.dto.PlaylistDTO;
import com.test.musichouduan.entity.Playlist;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 歌单服务接口
 */
public interface PlaylistService {

    /**
     * 根据ID获取歌单
     *
     * @param id 歌单ID
     * @return 歌单DTO
     */
    PlaylistDTO getPlaylistById(Long id);

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

    /**
     * 获取最新歌单列表
     *
     * @param limit 限制数量
     * @return 歌单列表
     */
    List<PlaylistDTO> getLatestPlaylist(Integer limit);

    /**
     * 获取热门歌单列表
     *
     * @param limit 限制数量
     * @return 歌单列表
     */
    List<PlaylistDTO> getHotPlaylist(Integer limit);

    /**
     * 获取官方歌单列表
     *
     * @param page 页码
     * @param size 每页大小
     * @return 分页结果
     */
    PageResult<PlaylistDTO> getOfficialPlaylist(Integer page, Integer size);

    /**
     * 添加歌单
     *
     * @param playlistDTO 歌单DTO
     * @param cover 封面文件
     * @return 歌单DTO
     */
    PlaylistDTO addPlaylist(PlaylistDTO playlistDTO, MultipartFile cover);

    /**
     * 更新歌单
     *
     * @param id 歌单ID
     * @param playlistDTO 歌单DTO
     * @param cover 封面文件
     * @return 歌单DTO
     */
    PlaylistDTO updatePlaylist(Long id, PlaylistDTO playlistDTO, MultipartFile cover);

    /**
     * 删除歌单
     *
     * @param id 歌单ID
     * @return 是否成功
     */
    boolean deletePlaylist(Long id);

    /**
     * 收藏歌单
     *
     * @param id 歌单ID
     * @return 是否成功
     */
    boolean collectPlaylist(Long id);

    /**
     * 取消收藏歌单
     *
     * @param id 歌单ID
     * @return 是否成功
     */
    boolean uncollectPlaylist(Long id);

    /**
     * 检查当前用户是否收藏了该歌单
     *
     * @param id 歌单ID
     * @return 是否收藏
     */
    boolean isCollected(Long id);

    /**
     * 获取用户收藏的歌单列表
     *
     * @param page 页码
     * @param size 每页大小
     * @return 分页结果
     */
    PageResult<PlaylistDTO> getCollectedPlaylist(Integer page, Integer size);

    /**
     * 获取用户创建的歌单列表
     *
     * @param page 页码
     * @param size 每页大小
     * @return 分页结果
     */
    PageResult<PlaylistDTO> getUserPlaylist(Integer page, Integer size);

    /**
     * 向歌单添加音乐
     *
     * @param id 歌单ID
     * @param musicId 音乐ID
     * @return 是否成功
     */
    boolean addMusicToPlaylist(Long id, Long musicId);

    /**
     * 从歌单移除音乐
     *
     * @param id 歌单ID
     * @param musicId 音乐ID
     * @return 是否成功
     */
    boolean removeMusicFromPlaylist(Long id, Long musicId);

    /**
     * 播放歌单
     *
     * @param id 歌单ID
     * @return 歌单DTO
     */
    PlaylistDTO playPlaylist(Long id);

    /**
     * 根据ID获取歌单实体
     *
     * @param id 歌单ID
     * @return 歌单实体
     */
    Playlist getById(Long id);
}
