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

import com.fasterxml.jackson.databind.ObjectMapper;
import com.kt.event.eventservice.application.dto.kafka.AIEventGenerationJobMessage;
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;

/**
 * AI 이벤트 생성 작업 메시지 발행 Producer
 *
 * ai-event-generation-job 토픽에 AI 추천 생성 작업 메시지를 발행합니다.
 *
 * @author Event Service Team
 * @version 1.0.0
 * @since 2025-10-27
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class AIJobKafkaProducer {

    private final KafkaTemplate<String, Object> kafkaTemplate;
    private final ObjectMapper objectMapper;

    @Value("${app.kafka.topics.ai-event-generation-job:ai-event-generation-job}")
    private String aiEventGenerationJobTopic;

    /**
     * AI 이벤트 생성 작업 메시지 발행
     *
     * @param jobId 작업 ID (JOB-{type}-{timestamp}-{random8})
     * @param userId 사용자 ID
     * @param eventId 이벤트 ID (EVT-{storeId}-{yyyyMMddHHmmss}-{random8})
     * @param storeName 매장명
     * @param storeCategory 매장 업종
     * @param storeDescription 매장 설명
     * @param objective 이벤트 목적
     */
    public void publishAIGenerationJob(
            String jobId,
            String userId,
            String eventId,
            String storeName,
            String storeCategory,
            String storeDescription,
            String objective) {

        AIEventGenerationJobMessage message = AIEventGenerationJobMessage.builder()
            .jobId(jobId)
            .userId(userId)
            .eventId(eventId)
            .storeName(storeName)
            .storeCategory(storeCategory)
            .storeDescription(storeDescription)
            .objective(objective)
            .status("PENDING")
            .createdAt(LocalDateTime.now())
            .build();

        publishMessage(message);
    }

    /**
     * AI 이벤트 생성 작업 메시지 발행
     *
     * @param message AIEventGenerationJobMessage 객체
     */
    public void publishMessage(AIEventGenerationJobMessage message) {
        try {
            // JSON 문자열로 변환
            String jsonMessage = objectMapper.writeValueAsString(message);

            CompletableFuture<SendResult<String, Object>> future =
                kafkaTemplate.send(aiEventGenerationJobTopic, message.getJobId(), jsonMessage);

            future.whenComplete((result, ex) -> {
                if (ex == null) {
                    log.info("AI 작업 메시지 발행 성공 - Topic: {}, JobId: {}, Offset: {}",
                        aiEventGenerationJobTopic,
                        message.getJobId(),
                        result.getRecordMetadata().offset());
                } else {
                    log.error("AI 작업 메시지 발행 실패 - Topic: {}, JobId: {}, Error: {}",
                        aiEventGenerationJobTopic,
                        message.getJobId(),
                        ex.getMessage(), ex);
                }
            });
        } catch (Exception e) {
            log.error("AI 작업 메시지 발행 중 예외 발생 - JobId: {}, Error: {}",
                message.getJobId(), e.getMessage(), e);
        }
    }
}
