package com.kt.event.eventservice.infrastructure.kafka;

import com.kt.event.eventservice.application.dto.kafka.EventCreatedMessage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.support.SendResult;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.concurrent.CompletableFuture;

/**
 * 이벤트 생성 메시지 발행 Producer
 *
 * event-created 토픽에 이벤트 생성 완료 메시지를 발행합니다.
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class EventKafkaProducer {

    private final KafkaTemplate<String, Object> kafkaTemplate;

    @Value("${app.kafka.topics.event-created}")
    private String eventCreatedTopic;

    /**
     * 이벤트 생성 완료 메시지 발행
     *
     * @param eventId 이벤트 ID
     * @param userId 사용자 ID
     * @param title 이벤트 제목
     * @param eventType 이벤트 타입
     */
    public void publishEventCreated(Long eventId, Long userId, String title, String eventType) {
        EventCreatedMessage message = EventCreatedMessage.builder()
            .eventId(eventId)
            .userId(userId)
            .title(title)
            .eventType(eventType)
            .createdAt(LocalDateTime.now())
            .timestamp(LocalDateTime.now())
            .build();

        publishEventCreatedMessage(message);
    }

    /**
     * 이벤트 생성 메시지 발행
     *
     * @param message EventCreatedMessage 객체
     */
    public void publishEventCreatedMessage(EventCreatedMessage message) {
        try {
            CompletableFuture<SendResult<String, Object>> future =
                kafkaTemplate.send(eventCreatedTopic, message.getEventId().toString(), message);

            future.whenComplete((result, ex) -> {
                if (ex == null) {
                    log.info("이벤트 생성 메시지 발행 성공 - Topic: {}, EventId: {}, Offset: {}",
                        eventCreatedTopic,
                        message.getEventId(),
                        result.getRecordMetadata().offset());
                } else {
                    log.error("이벤트 생성 메시지 발행 실패 - Topic: {}, EventId: {}, Error: {}",
                        eventCreatedTopic,
                        message.getEventId(),
                        ex.getMessage(), ex);
                }
            });
        } catch (Exception e) {
            log.error("이벤트 생성 메시지 발행 중 예외 발생 - EventId: {}, Error: {}",
                message.getEventId(), e.getMessage(), e);
        }
    }
}
