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 java.time.LocalDate;
import java.time.LocalDateTime;

/**
 * 이벤트 발행 인터페이스
 * 비즈니스 이벤트를 외부 시스템으로 발행
 */
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);
}