package com.unicorn.hgzero.stt.event.consumer;

import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * 회의 서비스 이벤트 소비자
 * 회의 관련 이벤트를 수신하여 STT 서비스에서 처리
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class MeetingEventConsumer {
    
    private final ObjectMapper objectMapper;
    
    /**
     * 회의 시작 이벤트 처리
     * 회의가 시작되면 STT 준비 상태로 전환
     */
    public void handleMeetingStarted(String eventData) {
        try {
            log.info("회의 시작 이벤트 수신: {}", eventData);
            
            // 실제로는 MeetingStarted 이벤트 파싱
            // MeetingStartedEvent event = objectMapper.readValue(eventData, MeetingStartedEvent.class);
            
            // STT 서비스 준비 로직
            prepareSttForMeeting(eventData);
            
        } catch (Exception e) {
            log.error("회의 시작 이벤트 처리 실패", e);
        }
    }
    
    /**
     * 회의 종료 이벤트 처리
     * 회의가 종료되면 진행 중인 녹음 자동 중지
     */
    public void handleMeetingEnded(String eventData) {
        try {
            log.info("회의 종료 이벤트 수신: {}", eventData);
            
            // 실제로는 MeetingEnded 이벤트 파싱
            // MeetingEndedEvent event = objectMapper.readValue(eventData, MeetingEndedEvent.class);
            
            // 진행 중인 녹음 자동 중지
            autoStopRecording(eventData);
            
        } catch (Exception e) {
            log.error("회의 종료 이벤트 처리 실패", e);
        }
    }
    
    /**
     * 참여자 입장 이벤트 처리
     * 참여자가 입장하면 화자 프로필 준비
     */
    public void handleParticipantJoined(String eventData) {
        try {
            log.info("참여자 입장 이벤트 수신: {}", eventData);
            
            // 실제로는 ParticipantJoined 이벤트 파싱
            // ParticipantJoinedEvent event = objectMapper.readValue(eventData, ParticipantJoinedEvent.class);
            
            // 화자 프로필 준비
            prepareSpeakerProfile(eventData);
            
        } catch (Exception e) {
            log.error("참여자 입장 이벤트 처리 실패", e);
        }
    }
    
    /**
     * STT 서비스 준비
     */
    private void prepareSttForMeeting(String eventData) {
        // 회의 정보 추출 및 STT 설정 준비
        log.info("STT 서비스 준비 중 - meetingData: {}", eventData);
        
        // 실제로는 다음과 같은 처리:
        // 1. Azure Speech Service 연결 설정
        // 2. WebSocket 엔드포인트 활성화
        // 3. 화자 인식 모델 로드
        // 4. 캐시 초기화
    }
    
    /**
     * 진행 중인 녹음 자동 중지
     */
    private void autoStopRecording(String eventData) {
        // 진행 중인 녹음 세션 조회 및 자동 중지
        log.info("진행 중인 녹음 자동 중지 - meetingData: {}", eventData);
        
        // 실제로는 다음과 같은 처리:
        // 1. 활성화된 녹음 세션 조회
        // 2. 녹음 중지 API 호출
        // 3. 최종 변환 결과 생성
        // 4. 리소스 정리
    }
    
    /**
     * 화자 프로필 준비
     */
    private void prepareSpeakerProfile(String eventData) {
        // 참여자 정보 기반 화자 프로필 준비
        log.info("화자 프로필 준비 중 - participantData: {}", eventData);
        
        // 실제로는 다음과 같은 처리:
        // 1. 참여자 정보에서 사용자 ID 추출
        // 2. 기존 화자 프로필 조회
        // 3. Azure Speaker Recognition 프로필 연결
        // 4. 화자 인식 모델 업데이트
    }
}