package com.unicorn.hgzero.notification.event.event;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 알림 발송 요청 이벤트 DTO
 *
 * 범용 알림 발송 이벤트
 * 다양한 서비스에서 알림 발송 시 사용
 *
 * @author 준호 (Backend Developer)
 * @version 1.0
 * @since 2025-10-25
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class NotificationRequestEvent {

    /**
     * 이벤트 고유 ID (중복 발송 방지용)
     */
    private String eventId;

    /**
     * 발송 채널 (EMAIL, SMS)
     */
    private String channel;

    /**
     * 알림 유형 (INVITATION, TODO_ASSIGNED, REMINDER 등)
     */
    private String notificationType;

    /**
     * 참조 대상 유형 (MEETING, TODO)
     */
    private String referenceType;

    /**
     * 참조 대상 ID
     */
    private String referenceId;

    /**
     * 관련 엔티티 유형 (이벤트 메시지의 relatedEntityType 매핑용)
     */
    private String relatedEntityType;

    /**
     * 관련 엔티티 ID (이벤트 메시지의 relatedEntityId 매핑용)
     */
    private String relatedEntityId;

    /**
     * 요청자 ID
     */
    private String requestedBy;

    /**
     * 요청자 이름
     */
    private String requestedByName;

    /**
     * 우선순위
     */
    private String priority;

    /**
     * 발신자
     */
    private String sender;

    /**
     * 제목 (subject)
     */
    private String subject;

    /**
     * 예약 발송 시간
     */
    private LocalDateTime scheduledTime;

    /**
     * 이벤트 발생 시간 (배열 형태로 수신)
     */
    private java.util.List<Integer> eventTime;

    /**
     * 알림 제목
     */
    private String title;

    /**
     * 알림 메시지
     */
    private String message;

    /**
     * 수신자 목록 (다중 수신자용)
     */
    private List<RecipientInfo> recipients;

    /**
     * 수신자 ID (단일 수신자용)
     */
    private String recipientId;

    /**
     * 수신자 이름 (단일 수신자용)
     */
    private String recipientName;

    /**
     * 수신자 이메일 (단일 수신자용)
     */
    private String recipientEmail;

    /**
     * 참여자 (단일 수신자용, recipients와 함께 사용 가능)
     */
    private String participant;

    /**
     * 템플릿 ID (이메일 템플릿)
     */
    private String templateId;

    /**
     * 템플릿 데이터 (템플릿 렌더링에 사용)
     */
    private Map<String, Object> templateData;

    /**
     * 추가 메타데이터 (회의 정보 등)
     */
    private Map<String, Object> metadata;

    /**
     * 이벤트 발행 일시
     */
    private LocalDateTime createdAt;

    /**
     * 수신자 정보 DTO
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    public static class RecipientInfo {
        /**
         * 사용자 ID
         */
        private String userId;

        /**
         * 사용자 이름
         */
        private String name;

        /**
         * 사용자 이메일
         */
        private String email;
    }
}
