package com.unicorn.hgzero.meeting.infra.event.publisher;

import com.unicorn.hgzero.meeting.infra.event.dto.MeetingStartedEvent;
import com.unicorn.hgzero.meeting.infra.event.dto.MeetingEndedEvent;
import com.unicorn.hgzero.meeting.infra.event.dto.TodoAssignedEvent;
import com.unicorn.hgzero.meeting.infra.event.dto.NotificationRequestEvent;
import com.unicorn.hgzero.meeting.infra.event.dto.MinutesAnalysisRequestEvent;
import com.unicorn.hgzero.meeting.infra.event.dto.MinutesFinalizedEvent;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 이벤트 발행 인터페이스
 * 비즈니스 이벤트를 외부 시스템으로 발행
 */
public interface EventPublisher {

    /**
     * 회의 시작 이벤트 발행
     * 
     * @param event 회의 시작 이벤트
     */
    void publishMeetingStarted(MeetingStartedEvent event);

    /**
     * 회의 종료 이벤트 발행
     * 
     * @param event 회의 종료 이벤트
     */
    void publishMeetingEnded(MeetingEndedEvent event);

    /**
     * Todo 할당 이벤트 발행
     * 
     * @param event Todo 할당 이벤트
     */
    void publishTodoAssigned(TodoAssignedEvent event);

    /**
     * 알림 요청 이벤트 발행
     * 
     * @param event 알림 요청 이벤트
     */
    void publishNotificationRequest(NotificationRequestEvent event);

    // 편의 메서드들 (컨트롤러에서 직접 사용)
    
    /**
     * Todo 할당 이벤트 발행 (편의 메서드)
     */
    void publishTodoAssigned(String todoId, String title, String assigneeId, String assigneeName, 
                           String assignedBy, String assignedByName, LocalDate dueDate);

    /**
     * Todo 완료 이벤트 발행 (편의 메서드)
     */
    void publishTodoCompleted(String todoId, String title, String assigneeId, String assigneeName,
                            String completedBy, String completedByName);

    /**
     * 회의록 확정 이벤트 발행 (편의 메서드)
     */
    void publishMinutesFinalized(String minutesId, String title, String finalizedBy, String finalizedByName);

    /**
     * 회의록 확정 이벤트 발행 (RAG 서비스용 완전한 이벤트)
     *
     * @param event 회의록 확정 이벤트 (전체 데이터 포함)
     */
    void publishMinutesFinalizedForRAG(MinutesFinalizedEvent event);

    /**
     * 회의 생성 알림 발행 (편의 메서드)
     * 참석자에게 회의 초대 이메일 발송
     *
     * @param meetingId 회의 ID
     * @param title 회의 제목
     * @param startTime 회의 시작 시간
     * @param location 회의 장소
     * @param participants 참석자 이메일 목록
     * @param organizerId 주최자 ID
     * @param organizerName 주최자 이름
     */
    void publishMeetingCreated(String meetingId, String title, LocalDateTime startTime,
                              String location, List<String> participants, String organizerId, String organizerName);

    /**
     * 회의록 AI 분석 요청 이벤트 발행
     * 
     * @param event AI 분석 요청 이벤트
     */
    void publishMinutesAnalysisRequest(MinutesAnalysisRequestEvent event);
}