package com.kt.event.analytics.repository;

import com.kt.event.analytics.entity.EventStats;
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.Optional;

/**
 * 이벤트 통계 Repository
 */
@Repository
public interface EventStatsRepository extends JpaRepository<EventStats, Long> {

    /**
     * 이벤트 ID로 통계 조회
     *
     * @param eventId 이벤트 ID
     * @return 이벤트 통계
     */
    Optional<EventStats> findByEventId(String eventId);

    /**
     * 이벤트 ID로 통계 조회 (비관적 락 적용)
     *
     * 동시성 충돌 방지를 위해 PESSIMISTIC_WRITE 락 사용
     * - 읽는 순간부터 락을 걸어 다른 트랜잭션 차단
     * - ParticipantRegistered 이벤트 처리 시 사용
     *
     * @param eventId 이벤트 ID
     * @return 이벤트 통계
     */
    @Lock(LockModeType.PESSIMISTIC_WRITE)
    @Query("SELECT e FROM EventStats e WHERE e.eventId = :eventId")
    Optional<EventStats> findByEventIdWithLock(@Param("eventId") String eventId);

    /**
     * 사용자 ID와 이벤트 ID로 통계 조회
     *
     * @param userId 사용자 ID
     * @param eventId 이벤트 ID
     * @return 이벤트 통계
     */
    Optional<EventStats> findByUserIdAndEventId(String userId, String eventId);

    /**
     * 사용자 ID로 모든 이벤트 통계 조회
     *
     * @param userId 사용자 ID
     * @return 이벤트 통계 목록
     */
    java.util.List<EventStats> findAllByUserId(String userId);
}
