package com.test.musichouduan.repository;

import com.test.musichouduan.entity.Playlist;
import com.test.musichouduan.entity.PlaylistType;
import com.test.musichouduan.entity.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.EntityGraph;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 歌单数据访问层
 */
@Repository
public interface PlaylistRepository extends JpaRepository<Playlist, Long>, JpaSpecificationExecutor<Playlist> {

    @EntityGraph(attributePaths = {"musics", "creator", "type"})
    Page<Playlist> findAll(Specification<Playlist> spec, Pageable pageable);

    @Query("SELECT pt.name, COUNT(p) FROM Playlist p JOIN p.type pt GROUP BY pt.name")
    List<Object[]> countByPlaylistType();

    /**
     * 根据类型统计歌单数量
     *
     * @param type 歌单类型
     * @return 歌单数量
     */
    long countByType(PlaylistType type);

    /**
     * 根据名称模糊查询歌单
     *
     * @param name 名称
     * @param pageable 分页
     * @return 歌单列表
     */
    Page<Playlist> findByNameContaining(String name, Pageable pageable);

    /**
     * 根据类型查询歌单
     *
     * @param type 类型
     * @param pageable 分页
     * @return 歌单列表
     */
    Page<Playlist> findByType(PlaylistType type, Pageable pageable);

    /**
     * 根据创建者查询歌单
     *
     * @param creator 创建者
     * @param pageable 分页
     * @return 歌单列表
     */
    Page<Playlist> findByCreator(User creator, Pageable pageable);

    /**
     * 查询官方歌单
     *
     * @param pageable 分页
     * @return 歌单列表
     */
    Page<Playlist> findByIsOfficial(Integer isOfficial, Pageable pageable);

    /**
     * 查询最新的歌单
     *
     * @param pageable 分页
     * @return 歌单列表
     */
    @Query("SELECT p FROM Playlist p ORDER BY p.createTime DESC")
    List<Playlist> findLatest(Pageable pageable);

    /**
     * 查询播放次数最多的歌单
     *
     * @param pageable 分页
     * @return 歌单列表
     */
    @Query("SELECT p FROM Playlist p ORDER BY p.playCount DESC")
    List<Playlist> findMostPlayed(Pageable pageable);

    /**
     * 统计用户创建的歌单数量
     *
     * @param creator 创建者
     * @return 歌单数量
     */
    long countByCreator(User creator);

    /**
     * 检查是否存在指定类型的歌单
     *
     * @param type 歌单类型
     * @return 是否存在
     */
    boolean existsByType(PlaylistType type);
}
