package com.test.musichouduan.service;

import com.test.musichouduan.dto.PageResult;
import com.test.musichouduan.dto.SingerDTO;
import com.test.musichouduan.entity.Singer;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 歌手服务接口
 */
public interface SingerService {

    /**
     * 根据ID获取歌手
     *
     * @param id 歌手ID
     * @return 歌手DTO
     */
    SingerDTO getSingerById(Long id);

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

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

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

    /**
     * 添加歌手
     *
     * @param singerDTO 歌手DTO
     * @param avatar 头像文件
     * @return 歌手DTO
     */
    SingerDTO addSinger(SingerDTO singerDTO, MultipartFile avatar);

    /**
     * 更新歌手
     *
     * @param id 歌手ID
     * @param singerDTO 歌手DTO
     * @param avatar 头像文件
     * @return 歌手DTO
     */
    SingerDTO updateSinger(Long id, SingerDTO singerDTO, MultipartFile avatar);

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

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

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

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

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

    /**
     * 添加音乐到歌手
     * @param singerId 歌手ID
     * @param musicId 音乐ID
     * @return 是否成功
     */
    boolean addMusicToSinger(Long singerId, Long musicId);

    /**
     * 从歌手移除音乐
     * @param singerId 歌手ID
     * @param musicId 音乐ID
     * @return 是否成功
     */
    boolean removeMusicFromSinger(Long singerId, Long musicId);

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