package com.unicorn.hgzero.stt.repository.jpa;

import com.unicorn.hgzero.stt.repository.entity.TranscriptSegmentEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 변환 세그먼트 JPA Repository
 * 변환 세그먼트에 대한 데이터베이스 접근을 담당
 */
@Repository
public interface TranscriptSegmentRepository extends JpaRepository<TranscriptSegmentEntity, String> {
    
    /**
     * 녹음 ID로 세그먼트 조회 (시간순 정렬)
     */
    List<TranscriptSegmentEntity> findByRecordingIdOrderByTimestamp(String recordingId);
    
    /**
     * 화자별 세그먼트 조회
     */
    List<TranscriptSegmentEntity> findBySpeakerIdOrderByTimestamp(String speakerId);
    
    /**
     * 녹음 및 화자별 세그먼트 조회
     */
    List<TranscriptSegmentEntity> findByRecordingIdAndSpeakerIdOrderByTimestamp(String recordingId, String speakerId);
    
    /**
     * 신뢰도가 낮은 세그먼트 조회
     */
    @Query("SELECT ts FROM TranscriptSegmentEntity ts WHERE ts.confidence < :threshold ORDER BY ts.confidence ASC")
    List<TranscriptSegmentEntity> findLowConfidenceSegments(@Param("threshold") Double threshold);
    
    /**
     * 경고 플래그가 설정된 세그먼트 조회
     */
    List<TranscriptSegmentEntity> findByWarningFlagTrueOrderByTimestamp();
    
    /**
     * 녹음별 화자 통계
     */
    @Query("SELECT ts.speakerId, COUNT(ts), SUM(ts.duration), AVG(ts.confidence) " +
           "FROM TranscriptSegmentEntity ts " +
           "WHERE ts.recordingId = :recordingId " +
           "GROUP BY ts.speakerId")
    List<Object[]> getSpeakerStatisticsByRecording(@Param("recordingId") String recordingId);
    
    /**
     * 녹음별 세그먼트 수 카운트
     */
    Long countByRecordingId(String recordingId);
    
    /**
     * 시간 범위 내 세그먼트 조회
     */
    @Query("SELECT ts FROM TranscriptSegmentEntity ts " +
           "WHERE ts.recordingId = :recordingId " +
           "AND ts.timestamp BETWEEN :startTime AND :endTime " +
           "ORDER BY ts.timestamp")
    List<TranscriptSegmentEntity> findByRecordingIdAndTimeRange(
            @Param("recordingId") String recordingId,
            @Param("startTime") Long startTime,
            @Param("endTime") Long endTime);
}