package com.kt.event.analytics.repository;

import com.kt.event.analytics.entity.ChannelStats;
import jakarta.persistence.LockModeType;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Lock;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

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

/**
 * 채널 통계 Repository
 */
@Repository
public interface ChannelStatsRepository extends JpaRepository<ChannelStats, Long> {

    /**
     * 이벤트 ID로 모든 채널 통계 조회
     *
     * @param eventId 이벤트 ID
     * @return 채널 통계 목록
     */
    List<ChannelStats> findByEventId(String eventId);

    /**
     * 이벤트 ID와 채널명으로 통계 조회
     *
     * @param eventId     이벤트 ID
     * @param channelName 채널명
     * @return 채널 통계
     */
    Optional<ChannelStats> findByEventIdAndChannelName(String eventId, String channelName);

    /**
     * 이벤트 ID와 채널명으로 통계 조회 (비관적 락)
     *
     * @param eventId     이벤트 ID
     * @param channelName 채널명
     * @return 채널 통계
     */
    @Lock(LockModeType.PESSIMISTIC_WRITE)
    @Query("SELECT c FROM ChannelStats c WHERE c.eventId = :eventId AND c.channelName = :channelName")
    Optional<ChannelStats> findByEventIdAndChannelNameWithLock(@Param("eventId") String eventId,
                                                                 @Param("channelName") String channelName);

    /**
     * 여러 이벤트 ID로 모든 채널 통계 조회
     *
     * @param eventIds 이벤트 ID 목록
     * @return 채널 통계 목록
     */
    List<ChannelStats> findByEventIdIn(List<String> eventIds);
}
