package com.red.circle.other.infra.database.mongo.repository;

import com.red.circle.other.infra.database.mongo.document.RocketStatusDocument;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

/**
 * 火箭状态Repository
 *
 * @author system
 * @date 2025-01-15
 */
@Repository
public interface RocketStatusRepository extends MongoRepository<RocketStatusDocument, String> {

    /**
     * 根据房间ID和日期查询（完整数据，包含所有贡献者）
     * 注意：用于需要完整贡献者列表的场景（如发射火箭保存历史）
     */
    Optional<RocketStatusDocument> findByRoomIdAndDate(Long roomId, String date);

    /**
     * 根据房间ID和日期查询（排除贡献者列表，性能优化）
     * 用于：仅需要火箭状态，不需要贡献者详情的场景
     */
    @Query(value = "{ 'roomId': ?0, 'date': ?1 }", fields = "{ 'contributors': 0 }")
    Optional<RocketStatusDocument> findByRoomIdAndDateWithoutContributors(Long roomId, String date);

    /**
     * 根据房间ID和日期查询（只包含Top N贡献者）
     * 用于：前端展示Top榜单的场景
     */
    @Query(value = "{ 'roomId': ?0, 'date': ?1 }", 
           fields = "{ 'contributors': { $slice: ?2 } }")
    Optional<RocketStatusDocument> findByRoomIdAndDateWithTopContributors(Long roomId, String date, Integer topN);

    /**
     * 根据房间ID列表和日期查询（排除贡献者列表）
     */
    @Query(value = "{ 'roomId': { $in: ?0 }, 'date': ?1 }", fields = "{ 'contributors': 0 }")
    List<RocketStatusDocument> findByRoomIdInAndDateWithoutContributors(List<Long> roomIds, String date);

    /**
     * 查询所有处于充能状态的火箭（排除贡献者列表）
     */
    @Query(value = "{ 'status': ?0, 'date': ?1 }", fields = "{ 'contributors': 0 }")
    List<RocketStatusDocument> findByStatusAndDateWithoutContributors(Integer status, String date);

    /**
     * 查询所有处于充能状态的火箭（完整数据）
     */
    List<RocketStatusDocument> findByStatusAndDate(Integer status, String date);

    /**
     * 删除指定日期之前的数据
     */
    void deleteByDateBefore(String date);

    /**
     * 根据日期查询所有火箭状态
     *
     * @param date 日期字符串 格式: yyyyMMdd
     * @return 火箭状态列表
     */
    List<RocketStatusDocument> findAllByDate(String date);
}
